学习日记0906 进程间通信(IPC机制) 消费者生产者模型 线程的基本理论

进程间通信IPC机制  

  

from multiprocessing import Queue

p= Queue()
p.put('123')
p.put('456')
print(p.get())
print(p.get())

 

  IPC机制用白话讲其实就是开辟了一个公共的内存空间,由于进程在内存中是隔离,所以开辟了这个空间以后我们就可以在进程间进行通信了,这个空间我们俗称为管道

生产者与消费者模型

  该模型的原理非常的简单:就是两个进程这间通过IPC机制进行通信,并且保证这两个进程是并发的

简单的生产者与消费者模型:

from multiprocessing import Process,JoinableQueue

def producer(name,p):
for i in range(10):
msg = '%s %s' %(name,i)
p.put(msg)
print('生产者生产了%s' % (msg))

def consumer(name,p):
while True:
msg = p.get()
print("消费者%s 消费了%s" % (name, msg))
p.task_done()

if __name__ == '__main__':
p = JoinableQueue()
pro = Process(target=producer,args=('a',p))
cons = Process(target=consumer,args=('xfz',p))
pro.start()
cons.start()
pro.join()
cons.join()
p.join()
print('主进程')

开启线程的两种方式:

方式一:

  

from threading import Thread

def task():
    print('线程已经开启!')


if __name__ == '__main__':
    ta = Thread(target=task)
    ta.start()
    print('主线程!')

方式二(开启线程时与开启进程是相似,就是调用Thread下的run方法):

from threading import Thread

class Mythread(Thread):
    def run(self):
        print('线程已经开启!')


if __name__ == '__main__':
    t= Mythread()
    t.start()
    print('zhu')

 

线程的特性

  在此简单的介绍一下进程的几种内置方法:

    .join()(等待子线程运行结束之后再运行主线程相当于等待)

    os.getpid()(得到线程的pid)

    active_count()(获取当前线程数)

守护线程

  

from threading import Thread
from multiprocessing import Process
import time
def foo():
    print(123)
    time.sleep(1)
    print("end123")

def bar():
    print(456)
    time.sleep(3)
    print("end456")

if __name__ == '__main__':
    # t1=Thread(target=foo)
    # t2=Thread(target=bar)

    t1=Process(target=foo)
    t2=Process(target=bar)
    t1.daemon=True
    t1.start()
    t2.start()
    print("main-------")

线程互斥锁

from threading import Thread,Lock

n = 100
mutex = Lock()
def task():
    global n
    with mutex:
        t = n
        # time.sleep(0.01)
        n = t-1

if __name__ == '__main__':
    t_l = []
    for i in range(100):
        t= Thread(target=task)
        t_l.append(t)
        t.start()
    for i in t_l:
        i.join()

    print(n)

 

posted @ 2018-09-06 15:51  周建豪  阅读(153)  评论(0编辑  收藏  举报