Python中是否有任何机制来控制多线程的最大值?

时间:2013-11-18 05:23:56

标签: java python multithreading

我想要一些像Java一样的Executors.newFixedThreadPool(3)

也就是说,我希望我的python程序一次最多分叉3个多线程,如果多线程的数量现在是3,等到数字小于3

python中有类似的东西吗?非常感谢!

2 个答案:

答案 0 :(得分:3)

我认为您需要的是semaphore object

threadLimiter = threading.BoundedSemaphore(maximumNumberOfThreads)

class YourThread(threading.Thread):

    def run(self):
        threadLimiter.acquire()
        try:
            <your code here>
        finally:
            threadLimiter.release()

当您启动线程超过最大线程数时,超出的线程将在threadLimiter.acquire()中等待,直到某些线程结束。

答案 1 :(得分:1)

如果您正在运行python 3.2+,则可以访问concurrent.futures,这是一个高级别的线程模块,可以方便地将其接口称为Executor。它有ThreadPoolExecutorProcessPoolExecutor两种口味。

#adapted example from docs
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
    future_results = [executor.submit(my_func, *args) for _ in range(100000)]
    for result in concurrent.futures.as_completed(future_results):
        #do something with each result

检索许多urllib.request次调用的结果的更多充实示例可以是found in the docs。应该注意的是,这就是你应该使用多个线程 - I / O绑定的任务。由于GIL,处理器绑定的任务不会受益于多线程 - 为此,使用ProcessPoolExecutor(利用multiprocessing)。