Python 2.7:“multiprocessing.Pool”中的“无法启动新线程”错误

Python 2.7:“multiprocessing.Pool”中的“无法启动新线程”错误,第1张

概述这是我的情况.代码几乎与 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 这是我的情况.代码几乎与 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):            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”中的“无法启动新线程”错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1195980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存