[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
でビルドするとちゃんと動いた。