这是我的情况。代码与example in the docs的代码几乎相同:
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)
传递给y
的batch_grad
有50个元素,Pool.map
抛出一个错误:
error: can't start new thread
从谷歌我知道,这通常是由于一个人试图启动太多的线程。也许只有我一个人,但我认为关于multiprocessing.Pool
的文档有点不完整。特别是,我不知道如何控制应该启动的线程数。在Pool
类的文档中甚至没有提到术语“线程”。在
multiprocessing.Pool
的整型参数是number of processes to start,而不是线程。在
那我该怎么解决呢?在
更新:值得注意的是,错误不会在每次运行代码时引发。在
我认为这个问题源于生成许多
Pool
,这个错误很奇怪,我认为@ChongMa是正确的,它与Python解释器本身不能产生线程有关。听起来我在评论中的建议可能对你有用,所以我把它重新贴在这里作为答案。在请尝试以下修复: a) 使用
Pool.close()
方法让每个Pool
知道它不会得到更多的工作:b)重复使用
^{pr2}$Pool
进行所有处理-将Pool
对象传递到batch_grad
函数中,而不是多个进程:希望这对你长期有效。在
相关问题 更多 >
编程相关推荐