我想创建一个运行多个轻线程的程序,但将自身限制为恒定的、预定义数量的并发运行任务,如下所示(但没有竞争条件的风险):
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()
实现这一点最安全/最快的方法是什么?
最佳答案
听起来你想用 8 个 worker 来实现生产者/消费者模式。 Python 有一个 Queue
用于此目的的类,它是线程安全的。
每个工作人员都应该在队列上调用 get()
来检索任务。如果没有可用的任务,此调用将阻塞,导致工作人员空闲,直到有一个可用。然后worker应该执行任务,最后调用队列中的task_done()
。
您可以通过在队列上调用 put()
将任务放入队列中。
在主线程中,你可以在队列中调用join()
,等待所有待处理的任务都完成。
这种方法的好处是您不会创建和销毁线程,这很昂贵。工作线程将连续运行,但当队列中没有任务时将进入休眠状态,使用零 CPU 时间。
(链接的文档页面有一个这种模式的例子。)
关于python - 限制一次运行的最大线程数的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19369724/