Python 限制并发线程的数量

Python 限制并发线程的数量,python,multithreading,python-multithreading,Python,Multithreading,Python Multithreading,确保此代码一次只运行8个线程的最简单方法是什么。我需要它来保持运行和重用线程。如果一条线结束,它应该立即在它的位置开始另一条线 threads = [] for user in user_list: thread = threading.Thread(target=parse_func, args= self,user,thread_name,), name= thread_name) thread.start() threads.append(thread) for t

确保此代码一次只运行8个线程的最简单方法是什么。我需要它来保持运行和重用线程。如果一条线结束,它应该立即在它的位置开始另一条线

threads = []
for user in user_list:
    thread = threading.Thread(target=parse_func, args= self,user,thread_name,), name= thread_name)
    thread.start()
    threads.append(thread)
for t in threads:
    t.join()
您可能希望像这样研究和使用它:

threading.BoundedSemaphore(maximumNumberOfThreads)
从文档中可以看出,信号量通常用于保护容量有限的资源,例如数据库服务器

另一个例子如下,摘自: 在生成任何工作线程之前,主线程将初始化信号量:

maxconnections = 5
...
pool_sema = BoundedSemaphore(value=maxconnections)
生成后,工作线程在需要连接到服务器时调用信号量的acquire和release方法:

pool_sema.acquire()
conn = connectdb()
... use connection ...
conn.close()
pool_sema.release()
您可能希望像这样研究和使用它:

threading.BoundedSemaphore(maximumNumberOfThreads)
从文档中可以看出,信号量通常用于保护容量有限的资源,例如数据库服务器

另一个例子如下,摘自: 在生成任何工作线程之前,主线程将初始化信号量:

maxconnections = 5
...
pool_sema = BoundedSemaphore(value=maxconnections)
生成后,工作线程在需要连接到服务器时调用信号量的acquire和release方法:

pool_sema.acquire()
conn = connectdb()
... use connection ...
conn.close()
pool_sema.release()
你想要一个线程池

线程池的概念是,应用程序代码不创建新线程,而是创建新任务,然后将任务提交到线程池。池由一定数量的线程(可能是可变数量,也可能是固定数量,取决于其实现方式)和阻塞队列组成

客户机程序将任务放入阻塞队列,而每个池线程位于一个循环中,从队列中获取任务并执行它们

一个简单化的线程池可能有一组固定的线程,并且它可能永远运行。一个复杂的线程池可能有办法启动或关闭线程,以响应不断变化的需求和/或不断变化的系统负载

我没有足够的Python经验来了解是否有每个人都使用的标准线程池接口,或者推荐任何现有的线程池实现

你可以自己写。拥有八个永久运行的固定线程的线程池并不难创建。

您想要一个线程池

线程池的概念是,应用程序代码不创建新线程,而是创建新任务,然后将任务提交到线程池。池由一定数量的线程(可能是可变数量,也可能是固定数量,取决于其实现方式)和阻塞队列组成

客户机程序将任务放入阻塞队列,而每个池线程位于一个循环中,从队列中获取任务并执行它们

一个简单化的线程池可能有一组固定的线程,并且它可能永远运行。一个复杂的线程池可能有办法启动或关闭线程,以响应不断变化的需求和/或不断变化的系统负载

我没有足够的Python经验来了解是否有每个人都使用的标准线程池接口,或者推荐任何现有的线程池实现


你可以自己写。拥有8个永久运行的固定线程的线程池并不难创建。

我最终生成了所需的确切数量的线程,比如100:

for i in range(100):
    Thread(target=get_url).start()
因为我希望每个线程都保持活动状态并不断检查处理队列,所以我在每个线程中使用了一个无限循环,以便100个线程继续运行。我不能使用线程池,因为它会在队列第一次用完时立即关闭-如果我在一小时后用更多的工作重新填充队列,线程池就会在那时关闭,因此我必须确保创建一个新的池等。在这一点上,维护我自己的池变得更容易

def get_url():
    while True:
        item = q_worker.get()
        #do work with item
        q_worker.task_done()

我最终产生了我所需要的确切数量的线程,比如说100个:

for i in range(100):
    Thread(target=get_url).start()
因为我希望每个线程都保持活动状态并不断检查处理队列,所以我在每个线程中使用了一个无限循环,以便100个线程继续运行。我不能使用线程池,因为它会在队列第一次用完时立即关闭-如果我在一小时后用更多的工作重新填充队列,线程池就会在那时关闭,因此我必须确保创建一个新的池等。在这一点上,维护我自己的池变得更容易

def get_url():
    while True:
        item = q_worker.get()
        #do work with item
        q_worker.task_done()

的文档包含一个示例。的文档包含一个示例。您的答案看起来像是一种限制可运行线程数的方法,但我认为OP正在寻找一种限制现有线程数的方法。哦,您可能是对的……感谢您的提示。让我们看看OP是否能解决这个问题;)你的答案看起来像是一种限制可运行线程数量的方法,但我认为OP正在寻找一种限制现有线程数量的方法。哦,你可能是对的……谢谢你的提示。让我们看看OP是否能解决这个问题;)