这是我的情况。代码与文档中的示例几乎相同:
from multiprocessing import Pool
import numpy as np
def grad(x0, y): return 0 # does some computational-heavy work actually
if __name__ == '__main__':
class UnrollArgs:
def __init__(self, func):
self.func = func
def __call__(self, args):
return self.func(*args)
def batch_grad(x0, y, processes=4):
g = Pool(processes).map(UnrollArgs(grad), [(x0, yi) for yi in y])
return np.sum([gi for gi in g], axis=0) / len(y)
我传递给batch_grad的y有50个元素,Pool.map引发错误:
错误:无法启动新线程
从Google上了解到,这通常是由于尝试启动太多线程而导致的。也许只是我觉得,但我认为关于multiprocessing.Pool的文档有点不完整。特别是,我不知道如何控制应该启动的线程数。在Pool类的文档中甚至没有提到“线程”一词。
multiprocessing.Pool的整数参数是要启动的进程数,而不是线程数。
那么我该怎么办呢?
更新:值得注意的是,并非每次运行代码都会引发错误。
grad
正在进行一些计算密集型的工作。错误是从Pool
类的map
函数内部引发的。我没有使用线程。 - theV0IDPyThread_start_new_thread
中创建线程时出现了低级别的失败(它是一个系统相关的线程库的包装器)。可能是内存不足导致的? - Cong Mamultiprocessing
在启动Python解释器本身时生成的,当有多个解释器进程被生成时。在这种情况下,您无法控制解释器启动的实际线程数量,至少不能通过multiprocessing
。但是我可能错了。我不是CPython内部的专家。 - Cong Ma