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

时间:2015-11-28 22:25:18

标签: python python-2.7 python-3.x python-multithreading

我有一个程序有两个线程,主线程和另一个用于处理FIFO队列中的作业的附加线程。 像这样:

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()方法的线程清除主线程退出时的队列?

2 个答案:

答案 0 :(得分:1)

评论涉及使用.join(),但根据您的使用案例,使用联接可能会使线程毫无意义。

我认为你的主线程除了向队列添加项目之外还会做其他事情 - 并且可能随时关闭,你只想确保在关闭完成之前你的队列是空的。

在主线程结束时,您可以在循环中添加一个简单的空检查。

while not q.empty():
    sleep(1)

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

答案 1 :(得分:1)

在队列中放置一个特殊项目(例如None),表示工作线程停止。

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()