gpt4 book ai didi

python - 如何将项目放回 queue.Queue

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:42 30 4
gpt4 key购买 nike

如何将项目返回到 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() 以在两个操作中将任务放回队列不是原子操作,因此可能会导致项目丢失。

一个可能但笨拙的解决方案是再次尝试执行该任务,但随后您必须添加一些额外的行来处理这种复杂性,我什至不确定所有失败的任务都必然以这种方式恢复。

最佳答案

并非所有失败的任务都能恢复。您不应该重试它们,除非有某种理由认为它们会在以后通过。例如,如果您的工作项是 URL 和连接失败计数,您可以实现某种最大重试次数。

您最大的问题是您尚未实现可行的工作人员模型。您需要 2 个队列才能与工作人员进行双向对话。一个用于发布工作项目,一个用于接收状态。一旦你有了它,接收者总是可以决定将该消息塞回工作队列。这是一个懒惰的工作人员的例子,它只是传递了它告诉的内容。

import threading
import queue

def worker(in_q, out_q):
while True:
try:
task, data = in_q.get()
print('worker', task, data)
if task == "done":
return
elif task == "pass this":
out_q.put(("pass", data))
else:
out_q.put(("fail", data))
except Exception as e:
print('worker exception', e)
out_q.put("exception", data)

in_que = queue.Queue()
out_que = queue.Queue()

work_thread = threading.Thread(target=worker, args=(in_que, out_que))
work_thread.start()

# lets make every other task a fail
in_que.put(('pass this', 0))
in_que.put(('fail this', 1))
in_que.put(('pass this', 2))
in_que.put(('fail this', 3))
in_que.put(('pass this', 4))
in_que.put(('fail this', 5))

pending_tasks = 6

while pending_tasks:
status, data = out_que.get()
if status == "pass":
pending_tasks -= 1
else:
# make failing tast pass
in_que.put(('pass this', data))

in_que.put(("done", None))
work_thread.join()
print('done')

关于python - 如何将项目放回 queue.Queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43422071/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com