如何将不同的env变量分配给池中的不同进程?

时间:2015-11-05 00:08:20

标签: python multiprocessing

我试图将不同的env变量分配给池中的进程。

我找到的唯一方法就是做某事。如下代码:

import os, multiprocessing

def init(env):
    os.environ = env
    os.environ['FOO'] = "foo_1"

def myfunc():
    print os.environ['FOO']

if __name__ == "__main__":
    child_env = os.environ.copy()
    child_env['FOO'] = "foo_2"
    pool = multiprocessing.Pool(initializer=init, initargs=(child_env,))
    child_env['FOO'] = "foo_3"
    for i in xrange(3):
        pool.apply_async(myfunc,()) # How to modify this line?
    pool.close()
    pool.join()

通过执行此操作,池中的所有进程共享相同的env var os.environ['FOO'] = "foo_1",因为它们共享相同的初始化程序。如何为不同的流程为FOO分配不同的值?

以上代码的输出:

foo_1
foo_1
foo_1

1 个答案:

答案 0 :(得分:0)

不是将args传递给myfunc,而是可以将参数传递给每个:

def myfunc(myarg):
    child_env = os.environ.copy()
    child_env['FOO'] = "foo_{}".format(myarg)
    print child_env['FOO']

if __name__ == "__main__":
    child_env = os.environ.copy()
    child_env['FOO'] = "foo_2"
    pool = multiprocessing.Pool(initializer=init, initargs=(child_env,))
    child_env['FOO'] = "foo_3"
    for i in xrange(3):
        pool.apply_async(func=myfunc, kwds=dict(myarg=i)) # How to modify this line?
    pool.close()
    pool.join()

我认为这至少可以让你到达目的地的一半。子函数现在负责在需要时修改其本地环境(可能正在运行一些需要它的子进程)。