Как мне поймать исключение, которое произошло в пределах цели Процесса? - PullRequest
0 голосов
/ 20 апреля 2019

Я создаю процесс для выполнения функции.Если функция вызывает исключение, я не могу его перехватить.Ниже приведен пример кода.

from multiprocessing import Process
import traceback
import time


class CustomTimeoutException(Exception):
    pass

def temp1():
    time.sleep(5)
    print('In temp1')
    raise Exception('I have raised an exception')

def main():
    try:
        p = Process(target=temp1)
        p.start()
        p.join(10)
        if p.is_alive():
            p.terminate()
            raise CustomTimeoutException('Timeout')

    except CustomTimeoutException as e:
        print('in Custom')
        print(e)

    except Exception as e:
        print('In exception')
        print(e)


if __name__ == "__main__":
    main()

Когда я запускаю приведенный выше код, исключение, вызванное в temp1, не перехватывается.Ниже приведен пример вывода

In temp1
Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "temp.py", line 12, in temp1
    raise Exception('I have raised an exception')
Exception: I have raised an exception

Я также пытался перезаписать метод run класса Process, как упомянуто в https://stackoverflow.com/a/33599967/9971556 Не очень полезно.

Ожидаемый вывод:

In exception
I have raised an exception
...