Непоследовательное поведение фьючерсов.ProcessPoolExecutor - PullRequest
0 голосов
/ 03 октября 2018

При рассмотрении следующего кода:

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

...