一尘不染

限制一次运行的最大线程数的正确方法?

python

我想创建一个运行多个轻线程的程序,但将其自身限制为恒定的,预定义数量的并发运行任务,如下所示(但不存在竞争条件的风险):

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()

最安全/最快的方法是什么?


阅读 144

收藏
2020-12-20

共1个答案

一尘不染

听起来您想用8个工人实现生产者/消费者模式。PythonQueue为此提供了一个类,它是线程安全的。

每个工作人员都应调用get()队列以检索任务。如果没有可用的任务,此调用将阻塞,从而导致工作人员空闲直到可用。然后,工作人员应执行任务,最后task_done()在队列上进行调用。

您可以通过调用队列来将任务放入put()队列。

在主线程中,您可以调用join()队列以等待所有未完成的任务完成。

这种方法的好处是您无需创建和销毁线程,这很昂贵。工作线程将连续运行,但是当队列中没有任何任务时,将使用零CPU时间进入睡眠状态。

(链接的文档页面上有这种模式的示例。)

2020-12-20