在某些情况下,多进程对嵌套函数不起作用

时间:2017-05-22 06:21:02

标签: python multiprocessing multiprocess

我有一段存储在字符串中的代码(用户在我的应用程序的文本框中编辑它)。在此代码中,我希望稍后使用multiprocess.Pool运行一个函数。但是如果字符串中定义的函数是嵌套的,它就不起作用。

请注意,我使用的是multiprocess,而不是标准multiprocessing,它根本无法运行字符串中定义的函数。

请参阅以下代码段中的评论,了解会发生什么。我可以在我的场景中使用任何解决方法吗?

funcs = """
def func(x):
    return func_inner(x) + 1

def func_inner(x):
    return x + 1
"""

import multiprocess

if __name__ == "__main__":
    symbols = dict()
    exec(funcs, symbols)
    func = symbols["func"]
    print(func(1))  # this is evaluated correctly as 3 so nesting functions work fine!
    data = [1, 2, 3]
    pool = multiprocess.Pool()
    print(pool.map(func, data))  # this fails with NameError: name 'func_inner' is not defined!

我也在Windows和Linux上试过这个。我的multiprocess版本是0.70.5和Python 3.5。

1 个答案:

答案 0 :(得分:0)

对于基于字符串的函数,您似乎缺少compile()

funcs=compile("""
def func(x):
    return func_inner(x) + 1

def func_inner(x):
    return x + 1
""", '<string>', 'exec')

if __name__ == "__main__":
   import multiprocess

   symbols = dict()
   exec(funcs, symbols)
   func = symbols["func"]
   print(func(1))
   data = [1, 2, 3]
   pool = multiprocess.Pool()
   print(pool.map(func, data))

为我输出:[3,4,5]

更新: 我的多进程版本是 - 0.70.4 尝试以下脏修复,应该适合你:

import multiprocess

code_globals = {}
code_locals = {}
exec funcs in code_globals, code_locals
print code_locals
# {'func_inner': <function func_inner at 0x10aa607d0>, 'func': <function func at 0x10a97dde8>}

code_globals['func_inner']=code_locals['func_inner']

print code_globals['func_inner']
#<function func_inner at 0x10a1427d0>

func = code_locals['func']
print(func(1))
data = [1, 2, 3]
pool = multiprocess.Pool()
print(pool.map(func, data))