Python 2.7:“multiprocessing.Pool”中的“无法启动新线程”错
发布时间:2020-12-20 13:07:20 所属栏目:Python 来源:网络整理
导读:这是我的情况.代码几乎与 example in the docs相同: from multiprocessing import Poolimport numpy as npdef grad(x0,y): return 0 # does some computational-heavy work actuallyif __name__ == '__main__': class UnrollArgs: def __init__(self,func):
这是我的情况.代码几乎与
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) 传递给batch_grad的y有50个元素,Pool.map抛出一个错误:
来自Google我知道这通常是因为一个人试图启动太多线程.也许这只是我,但我认为有关multiprocessing.Pool的文档有点不完整.特别是,我不知道如何控制应该启动的线程数.在Pool类的文档中甚至没有提到术语“线程”. multiprocessing.Pool的整数参数是number of processes to start,而不是线程. 那我怎么解决这个问题呢? 更新:可能值得注意的是,每次运行代码时都不会引发错误. 解决方法
我认为问题源于产生许多池.错误是奇怪的,我认为@ChongMa是正确的,它与Python解释器本身无法生成线程有关.听起来我在评论中的建议可能对你有用,所以我在这里作为答案重新发布.
尝试以下修复: def batch_grad(x0,processes=4): pool = Pool(processes) g = pool.map(UnrollArgs(grad),yi) for yi in y]) pool.close() return np.sum([gi for gi in g],axis=0) / len(y) b)重新使用Pool进行所有处理 – 将Pool对象传递给batch_grad函数,而不是多个进程: def batch_grad(x0,pool=None): if pool is None: pool = Pool(4) g = pool.map(UnrollArgs(grad),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) 希望这能长期为您服务. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |