the*_*0ID 5 python multithreading python-2.7 python-multiprocessing
这是我的情况。该代码与文档中的示例几乎相同:
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)
Run Code Online (Sandbox Code Playgroud)
Iy传递给batch_grad有 50 个元素并Pool.map抛出错误:
错误:无法启动新线程
从谷歌我知道这通常是由于一个人试图启动太多线程这一事实引起的。也许只是我个人的看法,但我认为文档multiprocessing.Pool有点不完整。特别是,我不知道如何控制应该启动的线程数量。该类的文档中甚至没有提到术语“线程” Pool。
的整数参数multiprocessing.Pool是要启动的进程数,而不是线程数。
那么我该如何解决这个问题呢?
更新:可能值得注意的是,每次运行代码时都不会引发错误。
我认为问题源于产生了很多Pools。这个错误很奇怪,我认为@ChongMa是正确的,它与Python解释器本身无法生成线程有关。听起来我在评论中的建议可能对你有用,所以我将其重新发布在这里作为答案。
尝试这些修复:a)使用该Pool.close()方法让每个人都知道Pool它不会再有任何工作:
def batch_grad(x0, y, processes=4):
pool = Pool(processes)
g = pool.map(UnrollArgs(grad), [(x0, yi) for yi in y])
pool.close()
return np.sum([gi for gi in g], axis=0) / len(y)
Run Code Online (Sandbox Code Playgroud)
b) 重新使用 aPool进行所有处理 - 将Pool对象传递到batch_grad函数中,而不是多个进程:
def batch_grad(x0, y, pool=None):
if pool is None:
pool = Pool(4)
g = pool.map(UnrollArgs(grad), [(x0, yi) for yi in y])
return np.sum([gi for gi in g], axis=0) / len(y)
# then call your function like so
p = Pool(4)
batch_grad(your_x0, your_y, p)
Run Code Online (Sandbox Code Playgroud)
希望这对您长期有效。