在Python中使用多处理模块时有两种队列:
它们之间有什么区别?
Queue
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
JoinableQueue https://docs.python.org/2/library/multiprocessing.html#multiprocessing.JoinableQueue有方法join()
and task_done()
, which Queue https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Queue hasn't.
类 multiprocessing.Queue( [maxsize] )
返回使用管道和一些锁/信号量实现的进程共享队列。当进程第一次将项目放入队列时,将启动供给线程,将对象从缓冲区传输到管道中。
标准库的 Queue 模块中常见的 Queue.Empty 和 Queue.Full 异常会引发信号超时。
Queue 实现了 Queue.Queue 中除 task_done() 和 join() 之外的所有方法。
类 multiprocessing.JoinableQueue( [maxsize] )
JoinableQueue 是 Queue 的子类,是一个另外具有 task_done() 和 join() 方法的队列。
任务完成()
指示先前排队的任务已完成。由队列消费者线程使用。对于用于获取任务的每个 get(),随后对 task_done() 的调用会告诉队列该任务的处理已完成。
如果 join() 当前处于阻塞状态,它将在处理完所有项目后恢复(这意味着对于已 put() 到队列中的每个项目都会收到一个 task_done() 调用)。
如果调用次数多于队列中放置的项目数,则会引发 ValueError。
join()
阻塞直到队列中的所有项目都已被获取并处理。
每当将项目添加到队列中时,未完成任务的计数就会增加。每当消费者线程调用task_done()以指示该项目已被检索并且其上的所有工作都已完成时,计数就会减少。当未完成任务的计数降至零时, join() 解除阻塞。
如果你使用JoinableQueue
那么你必须打电话JoinableQueue.task_done()
对于从队列中删除的每个任务,否则用于计算未完成任务数量的信号量最终可能会溢出,引发异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)