Многопроцессорная AsyncResult.get () зависает в Python 3.7.2, но не в 3.6 - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь перенести некоторый код из Python 3.6 в Python 3.7 в Windows 10. Я вижу, что многопроцессорный код зависает при вызове .get() для объекта AsyncResult.Код, о котором идет речь, гораздо сложнее, но я свел его к чему-то похожему на следующую программу:

import multiprocessing


def main(num_jobs):
    num_processes = max(multiprocessing.cpu_count() - 1, 1)
    pool = multiprocessing.Pool(num_processes)

    func_args = []
    results = []

    try:
        for num in range(num_jobs):
            args = (1, 2, 3)
            func_args.append(args)
            results.append(pool.apply_async(print, args))

        for result, args in zip(results, func_args):
            print('waiting on', args)
            result.get()
    finally:
        pool.terminate()
        pool.join()


if __name__ == '__main__':
    main(5)

Этот код также работает в Python 2.7.По какой-то причине первый вызов get() зависает в 3.7, но в других версиях все работает как положено.

1 Ответ

0 голосов
/ 01 февраля 2019

Я думаю, что это регрессия в Python 3.7.2, как описано здесь .Кажется, это влияет только на пользователей при работе в virtualenv.

В настоящее время вы можете обойти это, выполнив то, что описано в этом комментарии к ветке ошибок .

import _winapi
import multiprocessing.spawn
multiprocessing.spawn.set_executable(_winapi.GetModuleFileName(0))

Это заставит подпроцессы порождаться, используя real python.exe вместо того, который находится в virtualenv.Таким образом, это может не подходить, если вы объединяете вещи в исполняемый файл с PyInstaller, но он работает нормально при запуске из CLI с локальной установкой Python.

...