2010-08-04 39 views
2

我需要在python中使用线程池,并且我希望能够知道何时至少有1个outad或“允许的最大线程数”已完成,因此如果我仍然需要执行某些操作,则可以再次启动它。一个线程池让我知道什么时候至少有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()它看起来像那样)。

有人有一个例子来做我想达到的目的吗?

我的意思是只要我比poolSize检测到<,就启动新的线程,直到i = poolSize并且这样做直到数据被消耗。

+2

据我可以告诉他的代码做你想要的。他的joinAll()在加入线程之前一直等待任务队列为空... 值得注意的是最后一段: “Python中的线程池与其他语言相比有点用处不大,因为个人线程(大多数情况下)不能同时在多处理器机器上运行,因为Python有一个必须持有的单个全局解释器锁(GIL)来执行任何Python代码。(...)“ – getekha 2010-08-04 13:24:29

+0

不joinAll等待所有线程?我想为1(或更多)(其中任何一个)提供帮助。我知道python一次只能运行一个线程,但我仍然想尝试一下。 – jahmax 2010-08-04 13:31:57

回答

2

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

+0

我会检查它并编写一些示例,看看我能用它完成什么,谢谢! – jahmax 2010-08-04 13:43:07

1

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

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

相关问题