使用在另一个函数内定义的全局变量(函数)并使用局部变量进行多处理

问题描述 投票:0回答:1

我对这个设置做了一些测试,出乎意料地出现了我的问题的快速修复:

我想从multiprocessing.Pool.map()函数(设置参数)中调用main。但是,对于我来说,将本地定义的函数作为args之一更简单。由于后者不能被腌制,我尝试了最懒的解决方案,宣布它是全球性的。我应该期待一些奇怪的结果吗?你会建议一个不同的策略吗?

这是一个示例(虚拟)代码:

#!/usr/bin/env python3

import random
import multiprocessing as mp


def processfunc(arg_and_func):
    arg, func = arg_and_func
    return "%7.4f:%s" %(func(arg), arg)


def main(*args):
    # the content of var depends of main:
    var = random.random()

    # Now I need to pass a func that uses `var`
    global thisfunc
    def thisfunc(x):
        return x+var

    # Test regular use
    for x in range(-5,0):
        print(processfunc((x, thisfunc)))

    # Test parallel runs.
    with mp.Pool(2) as pool:
        for r in pool.imap_unordered(processfunc, [(x, thisfunc) for x in range(20)]):
            print(r)

if __name__=='__main__':
    main()

PS:我知道我可以在模块级别定义thisfunc,并通过var传递processfunc参数,但是因为我在现实生活中的实际processfunc已经需要很多参数,所以传递单个对象thisfunc而不是许多参数似乎更具可读性。 ..

python multiprocessing global-variables pickle
1个回答
1
投票

你现在拥有的东西看起来还不错,但对于以后的改变可能会很脆弱。

我可能会使用partial来简化var到全局定义函数的显式传递。

import random
import multiprocessing as mp
from functools import partial

def processfunc(arg_and_func):
    arg, func = arg_and_func
    return "%7.4f:%s" %(func(arg), arg)

def thisfunc(var, x):
    return x + var

def main(*args):
    # the content of var depends of main:
    var = random.random()
    f = partial(thisfunc, var)

    # Test regular use
    for x in range(-5,0):
        print(processfunc((x, thisfunc)))

    # Test parallel runs.
    with mp.Pool(2) as pool:
        for r in pool.imap_unordered(processfunc, [(x, f) for x in range(20)]):
            print(r)

if __name__=='__main__':
    main()
© www.soinside.com 2019 - 2024. All rights reserved.