0
文字列にコードを格納しています(ユーザがアプリケーションのテキストボックスにこれを編集します)。このコードには、multiprocess.Pool
を使って後で実行したい機能があります。しかし、文字列に定義されている関数がネストされている場合は機能しません。マルチプロセスではネストされた関数とうまく動作しない場合があります
標準multiprocessing
ではなく、multiprocess
を使用していますが、文字列に定義されている関数を実行することはできません。
何が起こるかは、次のスニペットのコメントを参照してください。私のシナリオで使用できる回避策はありますか?
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です。
、私はそれはまだ前と同じエラーで私のために失敗したかと思います。 –
どの 'マルチプロセス 'バージョンがありますか?最近のバージョンでは特定のことが壊れていると思われます。 –
'code_globals ['func_inner'] = code_locals ['func_inner']'を追加すると、コードスニペットが機能することが確認できます。しかし、実際には、私は事前にわかっていないので、実際にはこの関数は使用できません。入れ子になっているプールによって呼び出される関数は、 'code_globals.update(code_locals)'のようなものが必要ですすべてのローカルシンボルをグローバルシンボルに変換します。しかし、この線では、サンプルは再び壊れます。 –