我想创建一个运行多个轻线程的程序,但将自身限制为恒定的、预定义数量的并发运行任务,就像这样(但没有竞争条件的风险):
import threading
def f(arg):
global running
running += 1
print("Spawned a thread. running=%s, arg=%s" % (running, arg))
for i in range(100000):
pass
running -= 1
print("Done")
running = 0
while True:
if running < 8:
arg = get_task()
threading.Thread(target=f, args=[arg]).start()
实现这个最安全/最快的方法是什么?
原文由 d33tah 发布,翻译遵循 CC BY-SA 4.0 许可协议
听起来您想用八个工人实施生产者/消费者模式。 Python 有一个
Queue
类用于此目的,它是线程安全的。每个工作人员都应该在队列上调用
get()
来检索任务。如果没有任务可用,此调用将阻塞,导致 worker 空闲直到有任务可用。然后工作人员应该执行任务并最终在队列上调用task_done()
。您可以通过在队列上调用
put()
将任务放入队列中。从主线程,您可以在队列上调用
join()
等待所有待处理任务完成。这种方法的好处是您不会创建和销毁线程,这很昂贵。工作线程将连续运行,但当队列中没有任务时将休眠,使用零 CPU 时间。
(链接的文档页面有一个这种模式的例子。)