Ссылка:
Согласно 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()
используется для управления этим, и когда функция в одном из ваших потоков должна ждать результатов в другом потокетогда может произойти тупик, и ваш код не будет работать, этого вам следует избегать.