gpt4 book ai didi

python 2.7 : "can' t start new thread"error from "multiprocessing.Pool"

转载 作者:太空宇宙 更新时间:2023-11-03 11:26:23 25 4
gpt4 key购买 nike

这是我的情况。代码几乎与 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_grady 有 50 个元素,Pool.map 抛出错误:

error: can't start new thread

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

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

那我该如何解决呢?

更新:可能值得注意的是,并非每次我运行代码时都出现错误。

最佳答案

我认为问题源于产生许多 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 函数,而不是一些过程:

def batch_grad(x0, y, pool=None):
if pool is None:
pool = Pool(4)
g = pool.map(UnrollArgs(grad), [(x0, 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)

希望这对您长期有效。

关于 python 2.7 : "can' t start new thread"error from "multiprocessing.Pool",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32596101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com