我正在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
在处理完所有项目后会无限期地阻塞?
答案 0 :(得分:1)
来自docs:
每当有项目添加到未完成任务中时,未完成任务的数量就会增加 队列。 每当使用者线程调用时,计数就会减少 task_done()表示已检索到该项目及其所有工作 完成。当未完成的任务数降至零时,join() 解除封锁。
您永远不会在q.task_done()
函数中调用foo
。 foo
函数应类似于示例:
def worker():
while True:
item = q.get()
if item is None:
break
do_work(item)
q.task_done()