首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在退出主线程之前确保队列为空

如何在退出主线程之前确保队列为空
EN

Stack Overflow用户
提问于 2015-11-28 22:25:18
回答 2查看 11.7K关注 0票数 4

我有一个程序,它有两个线程,一个主线程,另一个用来处理FIFO队列中的作业。就像这样:

代码语言:javascript
复制
import queue
import threading

q = queue.Queue()

def _worker():
  while True:
      msg = q.get(block=True)
      print(msg)
      q.task_done()

t = threading.Thread(target=_worker)
#t.daemon = True
t.start()

q.put('asdf-1')
q.put('asdf-2')
q.put('asdf-4')
q.put('asdf-4')

我想要完成的基本任务是确保队列在主线程退出之前被清空。如果我将t.daemon设置为True,程序将在队列清空之前退出,但是如果设置为False,程序将永远不会退出。是否有办法确保运行_worker()方法的线程清除主线程出口上的队列?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-29 01:42:04

注释涉及到使用.join(),但是根据您的用例,使用连接可能会使线程没有意义。

我假设您的主线程将执行除向队列中添加项之外的其他事情--并且可能在任何时候被关闭,您只想确保队列在关闭完成之前是空的。

在主线程的末尾,可以在循环中添加一个简单的空检查。

代码语言:javascript
复制
while not q.empty():
    sleep(1)

如果不设置t.daemon = True,那么线程就永远不会完成。将线程设置为守护进程线程意味着,当主线程完成时,线程不会导致您的程序保持运行。

票数 3
EN

Stack Overflow用户

发布于 2018-03-21 21:01:50

在队列中放置一个特殊的项(例如,无),以指示工作线程停止。

代码语言:javascript
复制
import queue
import threading

q = queue.Queue()

def _worker():
  while True:
      msg = q.get(block=True)
      if msg is None:
          return
      print(msg) # do your stuff here

t = threading.Thread(target=_worker)
#t.daemon = True
t.start()

q.put('asdf-1')
q.put('asdf-2')
q.put('asdf-4')
q.put('asdf-4')
q.put(None)
t.join()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33977121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档