python 在main外部创建多处理池以避免递归

k97glaaz  于 2023-01-01  发布在  Python
关注(0)|答案(2)|浏览(115)

我有一个py文件,其中的函数需要多处理,所以我做了如下操作:

pool = Pool()
def function_():
  pool.map(...)

然后,我将这个文件导入到主文件中,但是当我运行function_时,我得到:
后台进程不允许有子进程
这通常是由于多处理将在调用文件的地方重新运行该文件(因此,通常必须将池插入if __name__ == "__main__",请参见此处Python multiprocessing gets stuck)...是否有办法避免这种情况?

ltskdhd1

ltskdhd11#

根据您发布的内容,不清楚为什么pool需要是全局的,但如果是这样,您可以在导入的模块中添加以下函数定义:

def create_pool():
    from multiprocessing import Pool
    global pool

    pool = Pool()

您的主脚本只需导入此函数并在调用function_之前调用它。如果pool不需要是全局的,只需将池创建移至 insidefunction_

hrirmatl

hrirmatl2#

只需重构所有需要多处理池的函数,让它们将池示例作为参数,然后在主模块中示例化池,并将其传递给从包中导入的函数,比如说,模块worker.py看起来如下所示:

def _func(x):
    return x * x

def process(pool):
    return pool.map(_func, list(range(10)))

主模块main.py如下所示:

#!/usr/bin/env python
import multiprocessing as mp

import worker

if __name__ == '__main__':

    with mp.Pool(5) as pool:
        results = worker.process(pool)

    print(results)

一切正常:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

相关问题