在某些情况下,多进程不能很好地处理嵌套函数

2024-04-29 19:55:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码存储在字符串中(用户在我的应用程序的文本框中编辑它)。在这段代码中,我想稍后使用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和python3.5。在


Tags: 函数字符串代码namereturn定义defthis
1条回答
网友
1楼 · 发布于 2024-04-29 19:55:25

似乎您只是缺少了基于字符串的函数的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 尝试下面的脏修补程序,应该对您有用:

^{pr2}$

相关问题 更多 >