32 进程之间的通信

进程间通信(Inter-Porcess Communication,简称IPC),首先要了解队列,它是先进先出的。通过from multiprocessing import Queue来使用。

from multiprocessing import Queue
q = Queue(6)
for i in range(6):
    q.put(i)
    print('%d放入队列'%i)
print('********************************')
while True:
    print(q.get())

通过队列,让两个子进程之间进行通信。

from multiprocessing import Queue,Process
def produce(q):
    q.put('hello')
def consume(q):
    print(q.get())
if __name__ == '__main__':
    q = Queue()
    p = Process(target=produce,args=(q,))
    p.start()
    p1 = Process(target=consume,args=(q,))
    p1.start()

生产者、消费者模型

一个队列是进程安全的,一个队列中的数据只能被一个进程请求数据。

from multiprocessing import Queue,Process
import time,random
def producer(name,food,q):
    for i in range(10):
        time.sleep(random.randint(1,3))
        f = '%s生产了%s%s'%(name,food,i)
        print(f)
        q.put(f)

def consumer(q,name):
    while True:
        food = q.get()
        if food is None:
            print('获取到一个空')
            break
        print('%s消费了%s'%(name,food))
        time.sleep(random.randint(1,3))

if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=producer,args=('张三','包子',q))
    p2 = Process(target=producer,args=('李四','胡辣汤',q))
    c1 = Process(target=consumer,args=(q,'王五'))
    c2 = Process(target=consumer,args=(q,'yan五'))
    p1.start()
    p2.start()
    c1.start()
    c2.start()
    p1.join()
    p2.join()
    q.put(None)
    q.put(None)

JoinableQueue

from multiprocessing import JoinableQueue,Process
def producer(name,food,q):
    for i in range(10):
        time.sleep(random.randint(1,3))
        f = '%s生产了%s%s'%(name,food,i)
        print(f)
        q.put(f)
    q.join()    #JoinableQueue的join代表阻塞 感知一个队列中的数据全部被执行完毕。

def consumer(q,name):
    while True:
        food = q.get()
        print('%s消费了%s'%(name,food))
        time.sleep(random.randint(1,3))
        q.task_done()   #提交一个回值,对q中的值的个数减一。
if __name__ == '__main__':
    q = JoinableQueue()
    p1 = Process(target=producer,args=('张三','包子',q))
    p2 = Process(target=producer,args=('李四','胡辣汤',q))
    c1 = Process(target=consumer,args=(q,'王五'))
    c2 = Process(target=consumer,args=(q,'yan五'))
    p1.start()
    p2.start()
    c1.daemon = True    #设置为守护进程,主进程代码执行完毕之后,子进程自动结束。
    c2.daemon = True
    c1.start()
    c2.start()
    p1.join()
    p2.join()   #进程的join是感知一个进程的结束

在消费者端:

  • 每次获取一个数据,发送一个记号,即:q.task_done(),标志一个数据被处理成功。

在生产者端:

  • 每生产一个数据,放入到队列中,并对数据做一个数据,当生产者生产完所有的数据,join信号已经停止生产数据,却要等待数据被消耗完,当数据都被处理完,join阻塞结束。

  • consumer中把所有的任务消耗完

  • producer的join感知到,阻塞停止

  • 所有的producer进程结束

  • 主进程中的p.join结束

  • 主进程中代码结束

  • 守护进程(消费者的进程)结束

猜你喜欢

转载自blog.csdn.net/weixin_43265998/article/details/90523125