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

时间:2019-02-26 19:00:14

标签: python multiprocessing global-variables pickle

我对此设置进行了一些测试,这些测试出乎意料地快速解决了我的问题:

我想从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而不是许多参数似乎更易读...

1 个答案:

答案 0 :(得分: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()