为什么此queue.join调用会无限期阻塞?

时间:2019-05-12 13:59:35

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

我正在python3.6中处理一个个人项目,并且遇到了以下问题,该问题导致<com.facebook.login.widget.LoginButton android:id="@+id/login_button" android:textSize="22sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" /> 调用被无限期阻塞。请注意,这不是我的实际代码,而是演示该问题的一个最小示例。

my_queue.join()

我得到以下输出(实际上是一致的,但是我知道输出顺序可能由于线程而有所不同):

import threading
import queue

def foo(stop_event, my_queue):
  while not stop_event.is_set():
    try:
      item = my_queue.get(timeout=0.1)
      print(item) #Actual logic goes here
    except queue.Empty:
      pass
  print('DONE')

stop_event = threading.Event()
my_queue = queue.Queue()
thread = threading.Thread(target=foo, args=(stop_event, my_queue))
thread.start()

my_queue.put(1)
my_queue.put(2)
my_queue.put(3)

print('ALL PUT')

my_queue.join()

print('ALL PROCESSED')

stop_event.set()

print('ALL COMPLETE')

无论我等待多长时间,都不会看到ALL PUT 1 2 3 输出到控制台,为什么ALL PROCESSED在处理完所有项目后会无限期地阻塞?

1 个答案:

答案 0 :(得分:1)

来自docs

  

每当有项目添加到未完成任务中时,未完成任务的数量就会增加   队列。 每当使用者线程调用时,计数就会减少   task_done()表示已检索到该项目及其所有工作   完成。当未完成的任务数降至零时,join()   解除封锁。

您永远不会在q.task_done()函数中调用foofoo函数应类似于示例:

def worker():
    while True:
        item = q.get()
        if item is None:
            break
        do_work(item)
        q.task_done()