我需要在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并执行此操作直到数据被消耗。
答案 0 :(得分:2)
正如文章作者提到的那样,@ getekha强调,Python中的线程池与其他语言完全不同。如果您需要并行性,则应查看multiprocessing
module。除此之外,它还有这些方便的Queue
和Pool
结构。此外,您可能希望监控an accepted PEP for "futures"。
答案 1 :(得分:1)
问题是Python有一个全局解释器锁,必须保存它才能运行任何Python代码。这意味着任何时候只有一个线程可以执行Python代码,因此Python中的线程池与其他语言中的线程池不同。这主要是出于神秘的原因,只有少数人知道(即它很复杂)。
如果你真的想异步运行代码,你应该生成新的进程; multiprocesssing
模块有一个Pool
类,您可以查看。