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): 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抛出一个错误:
error: can’t start new thread
来自Google我知道这通常是因为一个人试图启动太多线程.也许这只是我,但我认为有关multiprocessing.Pool的文档有点不完整.特别是,我不知道如何控制应该启动的线程数.在Pool类的文档中甚至没有提到术语“线程”.
multiprocessing.Pool的整数参数是number of processes to start,而不是线程.
那我怎么解决这个问题呢?
更新:可能值得注意的是,每次运行代码时都不会引发错误.
解决方法 我认为问题源于产生许多池.错误是奇怪的,我认为@ChongMa是正确的,它与Python解释器本身无法生成线程有关.听起来我在评论中的建议可能对你有用,所以我在这里作为答案重新发布.尝试以下修复:
a)使用Pool.close()方法让每个池知道它不会再有任何工作:
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 sop = Pool(4)batch_grad(your_x0,your_y,p)
希望这能长期为您服务.
总结以上是内存溢出为你收集整理的Python 2.7:“multiprocessing.Pool”中的“无法启动新线程”错误全部内容,希望文章能够帮你解决Python 2.7:“multiprocessing.Pool”中的“无法启动新线程”错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)