Python多进程系列之JoinableQueue类

2025-01-08 05:47:42
推荐回答(1个)
回答1:

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

1.基本介绍1.1 构造方法

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

1.2 实例方法

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

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

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

2.使用实例frommultiprocessingimportJoinableQueue,Processimporttimeimportrandomdefconsumer(q):whileTrue:res=q.get()print(f"消费者拿到了数据{res}")q.task_done()defproducer(seq,q):foriteminseq:time.sleep(random.random())q.put(item)print(f"生产者生成了数据{item}")q.join()if__name__=='__main__':q=JoinableQueue()seq=("产品数据%s"%iforiinrange(5))p=Process(target=consumer,args=(q,))p.daemon=Truep.start()producer(seq,q)print('主线程的运行')

result:

生产者生成了数据产品数据0消费者拿到了数据产品数据0生产者生成了数据产品数据1消费者拿到了数据产品数据1生产者生成了数据产品数据2消费者拿到了数据产品数据2生产者生成了数据产品数据3消费者拿到了数据产品数据3生产者生成了数据产品数据4消费者拿到了数据产品数据4主进程的运行