多进程系列之JoinableQueue类

345 阅读1分钟

JoinableQueue和Queue类似。但是JoinableQueue允许数据的消费者通知数据的生产者数据已被成功处理,通知是使用共享的信号锁和条件锁来实现的。

1.基本介绍

1.1 构造方法

JoinableQueue(maxsize):队列中允许的最大元素个数,省略时则无大小限制

1.2 实例方法

Queue的实例方法也都适用于JoinableQueue的实例,除此之外,JoinableQueue还有几个独有的实例方法。

task_done():消费者使用此方法发出信号,表示get()的返回数据已经被处理。如果调用该方法的次数大于从队列中删除元素的数量,将引发ValueError异常。

join():生产者调用该方法进行阻塞。直到队列中的每个数据都被处理。阻塞将持续到队列中的每个数据都调用task_done()方法为止。

2.使用实例

from multiprocessing import JoinableQueue, Process
import time
import random


def consumer(q):
    while True:
        res = q.get()
        print(f"消费者拿到了数据{res}")
        q.task_done()


def producer(seq, q):
    for item in seq:
        time.sleep(random.random())
        q.put(item)
        print(f"生产者生成了数据{item}")
    q.join()



if __name__ == '__main__':
    q = JoinableQueue()
    seq = ("产品数据%s" % i for i in range(5))
    p = Process(target=consumer, args=(q,))
    p.daemon = True
    p.start()
    producer(seq, q)
    print('主线程的运行')

result:

生产者生成了数据产品数据0

消费者拿到了数据产品数据0

生产者生成了数据产品数据1

消费者拿到了数据产品数据1

生产者生成了数据产品数据2

消费者拿到了数据产品数据2

生产者生成了数据产品数据3

消费者拿到了数据产品数据3

生产者生成了数据产品数据4

消费者拿到了数据产品数据4

主进程的运行