[Cython] [multiprocessing] Cython + multiprocessing の話

  • Foo/main.py
  • Foo/Bar/subBar.pyx
  • Foo/Bar/mainBar.py

みたいなディレクトリ構成で、中身は以下のような感じのときの話。

# main.py
from Bar import mainBar

bar = mainBar()
bar.bar()
# Bar/mainBar.py
from subBar import subFunc
import multiprocessing

class mainBar(object):
    def __init__(self):
        pass
    def bar():
        pool = multiprocessing.pool(4)
        result_list = []
        for input in range(4):
            result_list.append(pool.async_apply(subFunc, args=(input)))
        
        for i in range(4):
            print result_list[i].get()
# Bar/subBar.pyx
import cython

def subFunc(input):
    return input

要は、

  • main.py では Bar/mainBar.py のインスタンスを作って、そのインスタンスに対して bar() を適用
  • Bar/mainBar.py では Bar/subBar.pyx の関数を multiprocessing 経由で呼んでいる

という状況。

このとき、setup.pyは、main.pyと同じディレクトリにおいて、

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("Bar.subBar", ["Bar/subBar.pyx"])]
)

と書いて、

python setup.py build_ext --inplace

でビルドするとちゃんと動いた。