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

标签 python multithreading python-multithreading

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

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/

相关文章:

java - 带有参数线程的 JPA2 CriteriaQuery 可以安全地创建查询吗?

java - 如何在Kafka中使用多线程

Java:Swing工作线程同步

python - 我想停止线程时不停止

python - 如何使用 Python 在后台运行方法

python - Pygame:字体模块不可用

除非最后一条语句很慢,否则python函数无法返回

python - 如何在 logit statsmodel python 中包含交互变量?

python - 机器学习 - 为什么我会收到 ValueError?

python - 如何将来自Python中多个线程的同时数据写入csv文件