Является ли `concurrent.futures.map` поточно-ориентированным? - PullRequest
0 голосов
/ 19 марта 2019

Я нахожу это не упомянутым в документе: https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Executor.map

1 Ответ

1 голос
/ 22 марта 2019

Ссылка:

Согласно ThreadPoolExecutor

Могут возникать взаимоблокировки, когда вызываемый объект, связанный с Future, ожидает результатовдругое будущее.

2 примера показывают, как может возникнуть тупик.Попробуйте заменить .submit() на .map() и внести другие необходимые изменения.

Под капотом:

Согласно модулю Python python3.6/concurrent/futures/thread.py (поискВ вашей системе для этого файла класс ThreadPoolExecutor фактически использует queue.Queue() (см. строку 107) для реализации потоков Python и использует примитив threading.Lock() (см. строку 110) для блокировки потоков.

Объяснение:

Если для вас «потокобезопасность» означает несколько потоков в программе, каждый из которых пытается получить доступ к общей структуре данных или расположению в памяти, то вы должны знать, что concurrent.futures.ThreadPoolExecutor разрешить только одному потоку доступ к общей структуре данных или расположению в памяти за один раз , примитив threading.Lock() используется для управления этим, и когда функция в одном из ваших потоков должна ждать результатов в другом потокетогда может произойти тупик, и ваш код не будет работать, этого вам следует избегать.

...