一个线程池,让我知道至少1完成?

时间:2010-08-04 13:13:23

标签: python multithreading threadpool

我需要在python中使用一个线程池,我希望能够知道什么时候至少有1个或者“允许的最大线程数”已经完成,所以如果我还需要做某些事情,我可以再次启动它。

我一直在使用这样的东西:

def doSomethingWith(dataforthread):
    dostuff()
    i = i-1 #thread has finished

i = 0
poolSize = 5
threads = []
data = #array of data
while len(data):
    while True:
        if i<poolSize: #if started threads is < poolSize start new thread
            dataforthread = data.pop(0)
            i = i+1
            thread = doSomethingWith(dataforthread)
            thread.start()
            threads.append(thread)
        else:
            break
    for t in threads: #wait for ALL threads (I ONLY WANT TO WAIT FOR 1 [any])
        t.join()

据我所知,我的代码打开了5个线程,然后在启动新线程之前等待所有线程完成,直到数据被消耗。但我真正想做的是,只要其中一个线程完成,并且池中有一个新线程的“可用点”,就会启动一个新线程。

我一直在阅读this,但我认为这与我的代码存在相同的问题(不确定,我是python的新手,但是通过查看joinAll()看起来就像那样)。

有人有一个例子来做我想要实现的目标吗?

我的意思是,一旦我&lt;比poolSize,启动新线程直到i = poolSize并执行此操作直到数据被消耗。

2 个答案:

答案 0 :(得分:2)

正如文章作者提到的那样,@ getekha强调,Python中的线程池与其他语言完全不同。如果您需要并行性,则应查看multiprocessing module。除此之外,它还有这些方便的QueuePool结构。此外,您可能希望监控an accepted PEP for "futures"

答案 1 :(得分:1)

问题是Python有一个全局解释器锁,必须保存它才能运行任何Python代码。这意味着任何时候只有一个线程可以执行Python代码,因此Python中的线程池与其他语言中的线程池不同。这主要是出于神秘的原因,只有少数人知道(即它很复杂)。

如果你真的想异步运行代码,你应该生成新的进程; multiprocesssing模块有一个Pool类,您可以查看。