При рассмотрении следующего кода:
from concurrent import futures
import os
import signal
with futures.ProcessPoolExecutor(max_workers=2) as ex:
print('getting the pid for one worker')
f1 = ex.submit(os.getpid)
pid1 = f1.result()
print('killing process {}'.format(pid1))
os.kill(pid1, signal.SIGHUP)
print('submitting another task')
f2 = ex.submit(os.getpid)
try:
pid2 = f2.result()
except futures.process.BrokenProcessPool as e:
print('could not start new tasks: {}'.format(e))
except Exception as e:
print(str(e))
На выходе имеется несоответствие.Из документов, которые я прочитал, должно быть следующее:
"Если что-то случается с одним из рабочих процессов и неожиданно завершает его, ProcessPoolExecutor считается" сломанным "и больше не будетрасписание задач. "
Этот сценарий должен служить тому примером.Вместо этого, если я запускаю код несколько раз, я получаю следующий вывод:
(bot-LP2ewIkY) ⋊> ~/w/p/b/bot on master ⨯ python brokenPool.py 18:54:55
getting the pid for one worker
killing process 4373
submitting another task
could not start new tasks: A process in the process pool was terminated abruptly while the future was running or pending.
(bot-LP2ewIkY) ⋊> ~/w/p/b/bot on master ⨯ python brokenPool.py 18:54:56
getting the pid for one worker
killing process 4443
submitting another task
could not start new tasks: A process in the process pool was terminated abruptly while the future was running or pending.
(bot-LP2ewIkY) ⋊> ~/w/p/b/bot on master ⨯ python brokenPool.py 18:54:57
getting the pid for one worker
killing process 4514
submitting another task <----- (No exception thrown after this)
Как вы можете видеть (стрелка указывает на то, что не должно происходить), он генерирует исключение только часть времени.Это ошибка?
Примечание: вот связанный вопрос, на который я пытался получить ответ, который привел меня к обнаружению этого: ProcessPoolExecutor, обработка BrokenProcessPool
Обновление: сообщенов Python: https://bugs.python.org/issue34877