ネストされた関数をmultiprocessingする
関数f
の中に関数g
をネストし、f
の中でg
をmultiprocessing
で呼びたい。
だけど、ネストした関数g
はクロージャなので外側からは呼べず、すなわちmultiprocessing
はg
を参照できません。具体的に言うと、<function f.<locals>.g at ...>
なんかを参照したがると思います。
パッと思いついた応急処置書きます。
import time from multiprocessing import Pool def f(foo): global g proc = 4 def g(name): time.sleep(0.5) print('this is %s %s' % (foo, name)) p = Pool(proc) p.map(g, range(8)) f('multi')
こんな感じで関数をglobal
にすれば一応できます。こうする恩恵としてはf
の静的スコープをさくっとg
で扱える事ですかね。私のケースはmultiprocessing
でiterableと定数を引数に渡したくなって、しかしその為だけにグローバルに定数を置きたくなかったのでこんな感じにしました。
ちょっと変態的と言うかネストの意義を殺してる感じがあるので別な方法考えたいと思います