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
主进程的运行