import threading, queue
q = queue.Queue()
def worker():
while True:
item = q.get()
print(f'Working on {item}')
print(f'Finished {item}')
q.task_done()
# turn-on the worker thread
threading.Thread(target=worker, daemon=True).start()
# send thirty task requests to the worker
for item in range(30):
q.put(item)
print('All task requests sent\n', end='')
# block until all tasks are done
q.join()
print('All work completed')
3条答案
按热度按时间bqf10yzr1#
queue.SimpleQueue
处理的不仅仅是线程安全并发。它处理 * 可重入性 * -在不稳定的情况下调用queue.SimpleQueue.put
是安全的,因为它可能会中断同一线程中的其他工作。例如,您可以安全地从__del__
方法,weakref
回调或signal
模块信号处理程序调用它。如果需要,请使用
queue.SimpleQueue
。h6my8fg22#
python文档指定简单队列不能使用跟踪功能(task_done,join)。这些可以用来跟踪队列中的每个项目已经被另一个进程/线程处理。示例代码:
字符串
在上面的代码中,主线程使用join来等待其他线程完成处理它发送的每个项目。同时,工作线程每次处理队列中的项目时都会发出“task done”的信号。“task”在此上下文中是队列中的项目。
希望这对你有帮助,
更多文档请访问:https://docs.python.org/3/library/queue.html
t3psigkw3#
SimpleQueue是无限制的,也就是说,它不能有maxsize,并且永远不会在
put
上阻塞。这可能导致无限的内存使用,程序无限期地停止,而不是失败。对于非平凡的程序,您应该首选具有适当maxsize
的Queue。