我想创建一个运行多个轻线程的程序,但将其自身限制为恒定的,预定义数量的并发运行任务,如下所示(但不存在竞争条件的风险):
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个工人实现生产者/消费者模式。PythonQueue为此提供了一个类,它是线程安全的。
Queue
每个工作人员都应调用get()队列以检索任务。如果没有可用的任务,此调用将阻塞,从而导致工作人员空闲直到可用。然后,工作人员应执行任务,最后task_done()在队列上进行调用。
get()
task_done()
您可以通过调用队列来将任务放入put()队列。
put()
在主线程中,您可以调用join()队列以等待所有未完成的任务完成。
join()
这种方法的好处是您无需创建和销毁线程,这很昂贵。工作线程将连续运行,但是当队列中没有任何任务时,将使用零CPU时间进入睡眠状态。
(链接的文档页面上有这种模式的示例。)