ThreadPoolExecutor работает, но ProcessPoolExecutor нет - PullRequest
0 голосов
/ 29 октября 2018

Используя Python 3.7.1, это работает только

with concurrent.futures.ThreadPoolExecutor(max_workers = 2) as executor:
    print("Exec")
    result = executor.map(lambda a: kernel(**a), params)

также работает

for p in params:
    kernel(**p)

kernel возвращает дикт и выполняет некоторые вычислительные операции. Он не использует глобальные переменные. params содержит пользовательские классы, но pickle.dumps(params) не возвращает ошибок и байтовую строку.

Сам файл импортируется, то есть имеет if __name__ == "__main__": main() в нижней части.

Однако, если я использую ProcessPoolExecutor, выполнение останавливается. Exec напечатано, больше ничего. Загрузка процессора простаивает.

Я бы предпочел, чтобы модель Process обошла GIL.

Спасибо!

1 Ответ

0 голосов
/ 29 октября 2018

Отвечая на мой вопрос, старая версия Python подсказала мне:

Traceback (most recent call last):
  File "/usr/lib/python3.5/multiprocessing/queues.py", line 241, in _feed
    obj = ForkingPickler.dumps(obj)
  File "/usr/lib/python3.5/multiprocessing/reduction.py", line 50, in dumps
    cls(buf, protocol).dump(obj)
AttributeError: Can't pickle local object 'main.<locals>.<lambda>'

Итак, я убрал лямбда-выражение с карты, и теперь оно также работает с ProcessPoolExecutor.

...