我试图将不同的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
答案 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()
我认为这至少可以让你到达目的地的一半。子函数现在负责在需要时修改其本地环境(可能正在运行一些需要它的子进程)。