Этот код отлично работает под обычным CPython 3.5:
import concurrent.futures
def job(text):
print(text)
with concurrent.futures.ProcessPoolExecutor(1) as pool:
pool.submit(job, "hello")
Но если вы запустите его как python -m doctest myfile.py
, он зависнет. Изменение submit(job
на submit(print
устраняет зависание, как и использование ThreadPoolExecutor
вместо ProcessPoolExecutor
.
Почему он зависает при запуске под doctest?
with
. Вы можете воспроизвести это поведение без оператораwith
, выполнивpool = ...ProcessPoolExecutor()
pool.submit(...)
pool.shutdown()
. Проблема в блокировке импорта, как я отметил в своем ответе. 18.04.2018https://docs.python.org/3/library/imp.html#imp.lock_held
процитировал это в своем ответе, я просто знал, что это тупик импорта. Когда я сказал, что проблема заключается в оператореwith
, я имел в виду, что__exit__
оператораProcessPoolExecutor
выполнит методshutdown
и вызовет взаимоблокировку с импортом. Ваш ответ объясняет один слой ниже моего. Оба верны в своем собственном контексте. Вы объяснили, почему это не работает, а я объяснил, как заставить это работать. 18.04.2018