python3 JoinableQueue实现进程间的通信

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


def producer(food, queue):
    for i in range(2):
        time.sleep(random.randint(1, 3))
        info = "%s%s" % (food, i)
        queue.put(info)
        print("%s生成了%s" % (os.getpid(), info))
    queue.join()
    print("%s生产结束." % os.getpid())


def consumer(queue):
    while 1:
        info = queue.get()
        print("%s吃了%s" % (os.getpid(), info))
        time.sleep(random.randint(1, 3))
        queue.task_done()


if __name__ == '__main__':
    queue = JoinableQueue()
    p1 = Process(target=producer, args=("包子", queue,))
    p2 = Process(target=producer, args=("馅饼", queue,))
    c1 = Process(target=consumer, args=(queue,))
    c2 = Process(target=consumer, args=(queue,))
    c1.daemon = True
    c2.daemon = True

    p_lst = [p1, p2, c1, c2]
    for p in p_lst:
        p.start()

    p1.join()
    p2.join()
    print("主程序结束.")


# 5752生成了馅饼0
# 3200吃了馅饼0
# 6852生成了包子0
# 10044吃了包子0
# 5752生成了馅饼1
# 6852生成了包子1
# 3200吃了馅饼1
# 10044吃了包子1
# 5752生产结束.
# 6852生产结束.
# 主程序结束.
#JoinableQueue([maxsize]):这就像是一个Queue对象,但队列允许项目的使用者通知生成者项目已经被成功处理。通知进程是使用共享的信号和条件变量来实现的。

   #参数介绍:  maxsize是队列中允许最大项数,省略则无大小限制。   #方法介绍:  JoinableQueue的实例p除了与Queue对象相同的方法之外还具有: q.task_done():使用者使用此方法发出信号,表示q.get()的返回项目已经被处理。如果调用此方法的次数大于从队列中删除项目的数量,将引发ValueError异常 q.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止,也就是队列中的数据全部被get拿走了。

猜你喜欢

转载自www.cnblogs.com/lilyxiaoyy/p/10982626.html