一个让我知道至少有一个线程完成的线程池?

2 投票
2 回答
1195 浏览
提问于 2025-04-16 02:18

我想在Python中使用线程池,并且希望能够知道至少有一个线程完成了,或者说“最大线程数”已经完成,这样我就可以在需要的时候重新启动它。

我之前用的是这样的代码:

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个线程,然后在所有线程完成之前不启动新的线程,直到数据处理完。但是我真正想要的效果是:一旦有线程完成,并且线程池里有“空位”可以放新线程,就立刻启动一个新线程。

我看过这个链接,但我觉得那样也会有和我代码一样的问题(我不太确定,我刚学Python,但从joinAll()的代码看起来是这样的)。

有没有人能给我一个示例,帮助我实现我想要的效果?

我的意思是,尽快检测到当前线程数小于池的大小,然后启动新线程,直到线程数达到池的大小,并且一直这样做,直到数据处理完。

2 个回答

1

问题在于,Python有一个叫做全局解释器锁(Global Interpreter Lock,简称GIL)的东西,运行任何Python代码时都必须持有这个锁。这就意味着在任何时候,只有一个线程可以执行Python代码,所以Python中的线程池和其他语言的线程池不太一样。这主要是因为一些只有少数人知道的复杂原因(也就是说,这个事情比较复杂)。

如果你真的想要异步运行代码,应该创建新的进程;可以看看multiprocessing模块里的Pool类。

2

正如文章的作者提到的,@getekha 也强调,Python 中的线程池和其他语言中的作用并不完全相同。如果你需要实现并行处理,建议你看看 multiprocessing 模块。这个模块有一些很实用的功能,比如 QueuePool。另外,还有一个关于“未来”的 被接受的 PEP,你可能也想关注一下。

撰写回答