matrk's blog

十中八九Python書いてる

ネストされた関数をmultiprocessingする

 関数fの中に関数gをネストし、fの中でgmultiprocessingで呼びたい。  だけど、ネストした関数gクロージャなので外側からは呼べず、すなわちmultiprocessinggを参照できません。具体的に言うと、<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と定数を引数に渡したくなって、しかしその為だけにグローバルに定数を置きたくなかったのでこんな感じにしました。

 ちょっと変態的と言うかネストの意義を殺してる感じがあるので別な方法考えたいと思います