python - 如何将不同的环境变量分配给池中的不同进程?

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

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

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()

通过这样做,池中的所有进程共享相同的环境变量 os.environ['FOO'] = "foo_1" 因为它们共享相同的初始化程序。如何为不同的进程为 FOO 分配不同的值?

以上代码的输出:

foo_1
foo_1
foo_1

最佳答案

您可以向每个参数传递参数,而不是不向 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()

我认为这至少会让您完成一半。子函数现在负责在需要时修改其本地环境(也许它正在运行一些需要它的子进程)。

https://stackoverflow.com/questions/33534468/

相关文章:

amazon-web-services - spark-ec2 --copy-aws-credent

javascript - JS 闭包和函数参数

android - 我可以预加载 Animation Drawable 吗?

android - RecyclerView 不显示任何图像

Python - sys.stderr 未保存到 .txt 或 .log

javascript - AngularJS 错误 : [$injector:nomod]

sql-server - 动态透视多列

python - NumPy 或 SciPy 计算加权中位数

android - 如何使用具有不同文本和图像的相同布局

php - 在 IIS URL 重写后用 PHP 获取 URL 参数