关于文档中的示例: here
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
工人实际上如何知道所有工作已完成,队列为空并且我们可以退出?我不明白...
答案 0 :(得分:3)
您的工作程序挂在while True:
循环中,这意味着该函数/线程将永远不会返回。
“魔术”在于您未显示的代码:
t = Thread(target=worker)
t.daemon = True
t.start()
daemon参数控制何时可以退出uppper线程
当没有活动的非守护线程时,整个Python程序将退出。
这意味着程序将退出,因为主线程存在。 然后,工作线程仍然存在,但是在主线程结束时将被销毁(因为“没有剩余的非守护线程”)。
主线程退出条件是
q.join()
join
的文档记录将在停止阻止执行时显示。
[...]当未完成的任务数降至零时,join()会解除阻止。
答案 1 :(得分:1)
我会保持简单。队列基本上是诸如列表之类的项目的集合,区别在于它不允许元素的随机访问。您以某种方式插入和删除项目。队列的默认类型是FIFO(先进先出)。从名称中可以看出,就像在任何超市(或任何地方)看到的普通队列一样,第一个进入该行的人将首先离开。
共有三种类型的队列:
我说过的FIFO具有先进先出的规则:
import queue #importing the library
q=queue.Queue() #create a queue object
for i in range(5):
print(q.put(i)) #adding elements into our queue
while not q.empty():
print(q.get()) #to delete item and printing it
LIFO遵循先进先出的原则:
import queue #importing the library
q=queue.LifoQueue() #create a queue object
for i in range(5):
print(q.put(i)) #adding elements into our queue
while not q.empty():
print(q.get()) #to delete item and printing it
PRIORTY队列以升序输出数据,因为最小的队列将首先退出队列。
import queue #importing the library
q=queue.LifoQueue() #create a queue object
q.put(3)
q.put(7)
q.put(2)
q.put(7)
q.put(1)
while not q.empty():
print(q.get()) #to delete item and printing it
要回答最后一个问题(如示例所示),可以使用q.empty()
检查队列是否为空。
如果您还有其他疑问,请随时询问。