工作线程是否有Pool类,类似于多处理模块的Pool类?
我喜欢例如并行化地图功能的简单方法
def long_running_func(p):
c_func_no_gil(p)
p = multiprocessing.Pool(4)
xs = p.map(long_running_func, range(100))
Run Code Online (Sandbox Code Playgroud)
但是我想在没有创建新流程的开销的情况下这样做.
我知道GIL.但是,在我的用例中,该函数将是一个IO绑定的C函数,python包装器将在实际函数调用之前释放GIL.
我是否必须编写自己的线程池?
我知道这听起来像是以前被问过的问题,但是等等,我会解释为什么其他选项不起作用。
我目前正在使用multiprocessing.Pool在应用程序中实现并行性,并希望扩展它以能够利用嵌套并行性。Pool仅将对象作为参数传递的天真的方法apply_async不起作用,如其他答案中所述,因为Pool无法进行腌制。
这是我的要求:
我需要某种池来限制并发执行任务的数量。例如,multiprocess.Pool用于此目的,但它不能传递给其他进程。
我需要嵌套并行性。在我的应用程序中,我需要执行 I/O 来识别嵌套工作是什么,所以我绝对不想从单个线程执行此操作。我认为这排除了这个问题的所有答案。
它需要在标准库中;我无法添加依赖项。这就排除了这个答案。
我真的很希望它能够与 Python 2 和 3 一起使用。但是,如果可以证明迁移到 Python 3 可以解决我的问题,我会考虑它。
我不需要专门使用多个进程,使用线程就可以了,因为大部分工作是 I/O 或等待子进程完成。
我尝试过使用multiprocessing.dummy,它是相同的接口,但在threading. 但是,当我尝试调用get()以检索测试结果时,我收到以下错误,所以我认为这已经结束了。
File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get
raise self._value
ValueError: signal only works in main thread
Run Code Online (Sandbox Code Playgroud)
我知道concurrent.futuresPython 3 中的库,但这似乎有一些严重的限制。例如,本节中的第二个示例在我的例子中似乎是一个阻碍:
https://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor
我不明白如何使用基本上任何直接编写的嵌套并行算法来避免遇到这个问题。因此,即使我愿意使用 Python 3,我也认为这是不可能的。
如果没有编写我自己的实现,我不知道标准库中是否有任何其他可用选项。