Joblib Parallel + Cython висит навсегда - PullRequest
0 голосов
/ 27 ноября 2018

У меня очень странная проблема при создании расширения Python с использованием Cython, использующего joblib.Parallel.

Следующий код работает, как и ожидалось:

from joblib import Parallel, delayed
from math import sqrt

print(Parallel(n_jobs=4)(delayed(sqrt)(x) for x in range(4)))

Следующий код зависает навсегда:

from joblib import Parallel, delayed

def mult(x):
    return x*3

print(Parallel(n_jobs=4)(delayed(mult)(x) for x in range(4)))

Понятия не имею, почему.Я использую следующее setup.py:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("file.pyx")
)

Я создаю расширение с помощью python setup.py build_ext --inplace и импортирую его как import file.

Спасибо!

1 Ответ

0 голосов
/ 11 декабря 2018

Через некоторое время я наконец-то нашел решение: во время выбора состояния программы возникает тупик, чтобы отправить ее на разные процессоры.Я не совсем уверен в причине, но, изучая исходный код, выглядело так, как будто генерируются новые потоки, чтобы засечь объекты, и именно эти потоки вызывают тупик.

Как только процессы сгенерированы, они работают нормально: ручное создание процессов через библиотеку multiprocessing решает проблему.

В качестве альтернативы, вы можете использовать multiprocessing.Pool, задав вручную start_method:

from multiprocessing import get_context()

if __name__ == '__main__':
    with get_context("spawn").Pool() as pool:
        ...

Вы можете свободно выбирать spawn или forkserver как start_method.

Посетите эту страницу , если вам нужна дополнительная информация.

...