繁体   English   中英

Python - Queue究竟是如何工作的?

[英]Python - how exactly Queue works?

关于文档中的示例: https//docs.python.org/2/library/queue.html#Queue.Queue.get

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

实际上工人怎么知道所有的工作都已完成,队列是空的,我们可以退出? 我不明白......

你的工作程序会暂停一下while True:循环,这意味着函数/线程永远不会返回。

“魔力”在于你没有展示的代码:

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

守护进程参数控制超级线程何时可以退出

当没有剩下活着的非守护程序线程时,整个Python程序退出。

这意味着程序将退出,因为主线程存在。 工作线程终于存在,但是当主线程结束时将被销毁(因为“没有留下非守护程序线程”)。

主线程退出条件是

q.join()

join的documentatino将在停止阻止执行时显示。

[...]当未完成任务的数量降至零时,join()取消阻止。

我会保持简单。 队列基本上是列表的集合,例如列表,差异,它不允许随机访问元素。 您以某种方式插入和删除项目。 队列的默认类型是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()来检查您的队列是否为空。

如果您有任何疑问,请随时提出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM