Python3之进程生产者消费者模型(important)

  • Post author:
  • Post category:python


代码演示

'''
    首先,消费者函数从队列中取一次数值然后调用q.task_done()通知生产者函数,<font color="#ff0000">该元素</font>我已经取过了,直到将全部元素取出。
    在生产者函数中调用q.join()时,函数被挂起,直到队列的数据被全部取走,函数才能继续执行,生产者函数执行结束后,消费者函数还在等待队列中的数据,但此时消费者函数已经没有存活的必要,所以当主进程结束时,可以将该执行消费者函数的子进程带走,设置为守护进程即可'''
import os
import time
from multiprocessing import Process, JoinableQueue


def producer0(q):
    for i in range(5):
        print('%s 生产了 %s' % (os.getpid(), i))
        q.put(i)
    q.join()


def producer1(q):
    for i in range(5):
        print('%s 生产了 %s' % (os.getpid(), i))
        q.put(i)
    q.join()


def producer2(q):
    for i in range(5):
        print('%s 生产了 %s' % (os.getpid(), i))
        q.put(i)
    q.join()


def consumer(q):
    while 1:
        res = q.get()
        time.sleep(3)
        print('%s 消费了 %s' % (os.getpid(), res))
        q.task_done()


if __name__ == '__main__':

    q = JoinableQueue()

    p1 = Process(target=producer0, args=(q,))
    p2 = Process(target=producer1, args=(q,))
    p3 = Process(target=producer2, args=(q,))

    p4 = Process(target=consumer, args=(q,))
    p5 = Process(target=consumer, args=(q,))

    p_l = [p1, p2, p3, p4, p5]
    #数据取完后消费者还在等着数据加入队列,但是生产者函数已经结束了,所以消费者可以随着主进程的结束而结束,所以将消费者函数设置为守护进程。
    p4.daemon = True
    p5.daemon = True

    for p in p_l:
        p.start()

    p1.join()
    p2.join()
    p3.join()

    print('主进程')



版权声明:本文为qq_33733970原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。