类似于多进程池的线程池?

421 投票
11 回答
462008 浏览
提问于 2025-04-15 23:55

有没有类似于多进程模块中 Pool类 的线程池类?

我喜欢那种简单的方法来并行处理一个映射函数

def long_running_func(p):
    c_func_no_gil(p)

p = multiprocessing.Pool(4)
xs = p.map(long_running_func, range(100))

不过,我希望能在不创建新进程的情况下做到这一点。

我知道有全局解释器锁(GIL)。但是在我的使用场景中,这个函数是一个IO密集型的C函数,Python的包装器会在实际调用函数之前释放GIL。

我需要自己写一个线程池吗?

11 个回答

74

是的,它似乎有(或多或少)相同的接口。

import multiprocessing

def worker(lnk):
    ....    
def start_process():
    .....
....

if(PROCESS):
    pool = multiprocessing.Pool(processes=POOL_SIZE, initializer=start_process)
else:
    pool = multiprocessing.pool.ThreadPool(processes=POOL_SIZE, 
                                           initializer=start_process)

pool.map(worker, inputs)
....
280

在Python 3中,你可以使用concurrent.futures.ThreadPoolExecutor,也就是说:

executor = ThreadPoolExecutor(max_workers=10)
a = executor.submit(my_function)

想了解更多信息和示例,可以查看文档

546

我刚发现其实在 multiprocessing 模块里有一个基于线程的池接口,不过它有点隐藏,而且文档也不太完善。

你可以通过以下方式导入它:

from multiprocessing.pool import ThreadPool

这个功能是通过一个虚拟的进程类来实现的,这个类实际上是用一个 Python 线程包装起来的。这个基于线程的进程类可以在 multiprocessing.dummy 找到,文档里也有简单提到过 相关内容。这个虚拟模块据说提供了整个基于线程的多进程接口。

撰写回答