类似于多进程池的线程池?
有没有类似于多进程模块中 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
找到,文档里也有简单提到过 相关内容。这个虚拟模块据说提供了整个基于线程的多进程接口。