限制同时运行的最大线程数的正确方法?

新手上路,请多包涵

我想创建一个运行多个轻线程的程序,但将自身限制为恒定的、预定义数量的并发运行任务,就像这样(但没有竞争条件的风险):

 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 许可协议

阅读 1k
2 个回答

听起来您想用八个工人实施生产者/消费者模式。 Python 有一个 Queue 类用于此目的,它是线程安全的。

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

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

从主线程,您可以在队列上调用 join() 等待所有待处理任务完成。

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

(链接的文档页面有一个这种模式的例子。)

原文由 cdhowie 发布,翻译遵循 CC BY-SA 3.0 许可协议

信号量 是一种变量或抽象数据类型,用于控制并发系统(例如多道程序操作系统)中多个进程对公共资源的访问;这可以在这里帮助你。

 threadLimiter = threading.BoundedSemaphore(maximumNumberOfThreads)

class MyThread(threading.Thread):

    def run(self):
        threadLimiter.acquire()
        try:
            self.Executemycode()
        finally:
            threadLimiter.release()

    def Executemycode(self):
        print(" Hello World!")
        # <your code here>

这样你就可以很容易地限制在程序执行过程中并发执行的线程数。变量“maximumNumberOfThreads”可用于定义线程最大值的上限。

学分

原文由 Hammad Haleem 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题