Python2.7:“无法启动新线程”错误来自多处理.池"

2024-09-30 22:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的情况。代码与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)

传递给ybatch_grad有50个元素,Pool.map抛出一个错误:

error: can't start new thread

从谷歌我知道,这通常是由于一个人试图启动太多的线程。也许只有我一个人,但我认为关于multiprocessing.Pool的文档有点不完整。特别是,我不知道如何控制应该启动的线程数。在Pool类的文档中甚至没有提到术语“线程”。在

multiprocessing.Pool的整型参数是number of processes to start,而不是线程。在

那我该怎么解决呢?在

更新:值得注意的是,错误不会在每次运行代码时引发。在


Tags: 代码inimportselfreturndefnp线程
1条回答
网友
1楼 · 发布于 2024-09-30 22:24:26

我认为这个问题源于生成许多Pool,这个错误很奇怪,我认为@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)

b)重复使用Pool进行所有处理-将Pool对象传递到batch_grad函数中,而不是多个进程:

^{pr2}$

希望这对你长期有效。在

相关问题 更多 >