python IPC机制和生产者与消费者(案例)

IPC机制:进程间通信或跨进程通信,指两个进程之间进行数据交换。

模型:生产者+媒介(队列)+消费者(用到的就是IPC机制)
这里队列用JoinableQueue这个模块,该模块有以下几个方法:

 JoinableQueue()内有自带计数器,每当队列放一个数据的时候,会自动+1
 task_done()方法,每从队列取出一个数据的时候,会自动减1
 q.join(),当计数器为0时候才会执行

同时:将消费者进程设置成守护进程,这样q.join()执行完毕的时候,消费者子进程也会跟着结束

c1.daemon=True

具体完整代码如下:

# -*-coding:utf-8 -*-
from multiprocessing import Process, Queue, JoinableQueue
import time
import random


def productor(name, food, q):
    for i in range(1,4):
        data="%s做好了%s%s"%(name,food,i)
        # 模拟延迟
        time.sleep(random.randint(1,3))
        q.put(data)
        print(data)

def customer(name, q):
    while True:
        food=q.get()
        #模拟延迟
        time.sleep(random.randint(1,3))
        print("%s吃了%s"%(name,food))
        # task_done()方法,每从队列取出一个数据的时候,会自动减1
        q.task_done()


if __name__ == '__main__':
    #JoinableQueue()内有自带计数器,每当队列放一个数据的时候,会自动+1
    q = JoinableQueue()
    # 生产者
    p1 = Process(target=productor, args=('alex', '包子', q,))
    p2 = Process(target=productor, args=('egon', '肠粉', q,))
    # 消费者
    c1=Process(target=customer,args=('李浩', q,))
    c2 = Process(target=customer, args=('猪哥', q,))
    # 开启守护进程
    c1.daemon=True
    c2.daemon=True
    # 开启进程
    p1.start()
    p2.start()
    c1.start()
    c2.start()
    # 保证生产全部生产完
    p1.join()
    p2.join()
    # q.join(),当计数器为0时候才会执行
    q.join()

 

posted @ 2020-09-16 15:04  NQ31  阅读(138)  评论(0编辑  收藏  举报