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

How to make sure queue is empty before exiting main thread

我有一个程序有两个线程,一个是主线程,另一个是处理来自 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() 方法在主线程退出时清除队列?

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

我假设您的主线程将执行除向队列中添加项目之外的其他操作 - 并且可能随时关闭,您只想确保您的队列在关闭完成之前为空。

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

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

如果您不设置 t.daemon = True 则线程永远不会结束。将线程设置为守护线程将意味着该线程不会导致您的程序在主线程完成时停留运行。

在队列中放置一个特殊项目(例如 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()