【发布时间】:2020-10-16 15:39:16
【问题描述】:
如何将项目返回到 queue.Queue?如果任务失败,这在线程或多处理中很有用,因此任务不会丢失。
docs for queue.Queue.get() 说函数可以“从队列中删除并返回一个项目”,但我相信这里使用的“返回”一词是指函数将项目返回给调用线程,而不是放置它回到项目队列。下面的示例代码证明了这一点,它只是在主线程的第二个 queue.Queue.get() 调用上无限阻塞,而不是在线程中的 print() 调用上进行。
import time
import threading
import queue
def threaded_func():
thread_task = myqueue.get()
print('thread_task: ' + thread_task)
myqueue = queue.Queue()
myqueue.put('some kind of task')
main_task = myqueue.get()
print('main_task: ' + main_task)
t = threading.Thread(target=threaded_func)
t.daemon = True
t.start()
time.sleep(5)
myqueue.get() # This blocks indefinitely
我必须相信有一种简单的方法可以将任务放回去,那是什么?调用task_done(),然后调用put() 并在两个操作中将其放回队列中的任务不是原子的,因此可能会导致丢失项目。
一种可能但笨拙的解决方案是尝试再次执行任务,但是您必须添加一些额外的行来处理这种复杂性,我什至不确定所有失败的任务是否一定会以这种方式恢复。
【问题讨论】:
-
您在解释问题,但并没有真正解释总体目标。那么你到底想在这里完成什么?
-
这是为了不丢失失败的工作项,以便以后能够处理它。我的具体用途是调用 REST API URL,当工作项 URL 不固有的一些问题可能导致它失败时。
标签: python multithreading queue