Python-队列到底如何工作?

时间:2018-07-02 11:18:36

标签: python multithreading

关于文档中的示例: here

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

工人实际上如何知道所有工作已完成,队列为空并且我们可以退出?我不明白...

2 个答案:

答案 0 :(得分:3)

您的工作程序挂在while True:循环中,这意味着该函数/线程将永远不会返回。

“魔术”在于您未显示的代码:

 t = Thread(target=worker)
 t.daemon = True
 t.start()

daemon参数控制何时可以退出uppper线程

  

当没有活动的非守护线程时,整个Python程序将退出。

这意味着程序将退出,因为主线程存在。 然后,工作线程仍然存在,但是在主线程结束时将被销毁(因为“没有剩余的非守护线程”)。

主线程退出条件是

q.join()

join的文档记录将在停止阻止执行时显示。

  

[...]当未完成的任务数降至零时,join()会解除阻止。

答案 1 :(得分:1)

我会保持简单。队列基本上是诸如列表之类的项目的集合,区别在于它不允许元素的随机访问。您以某种方式插入和删除项目。队列的默认类型是FIFO(先进先出)。从名称中可以看出,就像在任何超市(或任何地方)看到的普通队列一样,第一个进入该行的人将首先离开。

共有三种类型的队列:

  1. FIFO
  2. LIFO
  3. 优先级

我说过的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()检查队列是否为空。

如果您还有其他疑问,请随时询问。