在Python中,当使用多处理模块时,有两种队列:
他们之间有什么区别?
from multiprocessing import Queue
q = Queue()
q.put(item) # Put an item on the queue
item = q.get() # Get an item from the queue
from multiprocessing import JoinableQueue
q = JoinableQueue()
q.task_done() # Signal task completion
q.join() # Wait for completion
^{} 有方法} 没有
join()
和task_done()
,而^{如果使用
JoinableQueue
,则必须为从队列中删除的每个任务调用JoinableQueue.task_done()
,否则用于计算未完成任务数的信号量最终可能溢出,引发异常。根据文档,很难确定
Queue
实际上是空的。使用JoinableQueue
可以通过调用q.join()
等待队列清空。如果您希望在不同的批次中完成工作,并且在每个批次的末尾执行一些离散的操作,这可能会有帮助。例如,您可能通过队列一次处理1000个项目,然后向用户发送一个推送通知,告知您已经完成了另一个批处理。这对于使用普通的
Queue
实现是一个挑战。可能看起来像:
注:我还没有真正运行这个代码。如果您从队列中提取项目的速度比放置项目的速度快,则可能会提前完成。在这种情况下,这段代码至少每1000条发送一次更新,而且可能更频繁。对于进度更新,这可能是可以的。如果精确到1000很重要,那么可以使用
mp.Value('i', 0)
,并在join
发布时检查它是否为1000。相关问题 更多 >
编程相关推荐