Python-线程池类似于多处理池?
是否有用于工作线程的Pool
类,类似于多处理模块的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
。
我必须编写自己的线程池吗?
-
我刚刚发现模块中实际上 有一个基于线程的Pool接口
multiprocessing
,但是它有些隐藏并且没有正确记录。可以通过导入
from multiprocessing.pool import ThreadPool
它是使用包装Python线程的虚拟
Process
类实现的。可以找到基于线程的Proces
s类multiprocessing.dummy
,在docs中对其进行了简要介绍。该虚拟模块应该提供基于线程的整个多处理接口。 -
在Python 3中,你可以使用
concurrent.futures.ThreadPoolExecutor
,即:executor = ThreadPoolExecutor(max_workers=10) a = executor.submit(my_function)