2015-11-05 85 views
2

我正在嘗試爲池中的進程分配不同的env變量。如何將不同的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() 

通過這樣做,在池中共享所有進程相同的環境變量os.environ['FOO'] = "foo_1",因爲它們共享相同的初始化。如何爲不同的流程分配FOO不同的值?從上面的代碼

輸出:

foo_1 
foo_1 
foo_1 

回答

0

,而不是通過無參數來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() 

我認爲,這將讓你有至少一半的方式。子功能現在負責修改其本地環境(如果需要的話)(可能它正在運行某個需要它的子進程)。

+0

感謝您的回答。然而,我有一些阻止我傳遞參數的理由......所以它只能通過env vars完成(甚至不允許管道)。 – stanleyli

+0

你可以通過設置環境然後調用myfunc的包裝函數「myfunc_wrapper(myarg)」來解決這個問題嗎? – rkh

相關問題