加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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抛出一个错误:

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 so
p = Pool(4)
batch_grad(your_x0,your_y,p)

希望这能长期为您服务.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读