Как завершить процесс, но также вызвать __exit __ ()? - PullRequest
0 голосов
/ 07 августа 2020

В моей программе я вызываю класс с методом __exit__() как процесс из from multiprocessing import Process. Когда в основной программе возникает ошибка, я делаю myprocess.terminate(), но это не вызывает метод __exit__().

Как я могу завершить процесс, но также вызвать __exit__?

Дополнение: у меня есть 2 процесса, и я хочу выйти из них, когда 1 завершается sys.exit(). Вот мой способ сделать это прямо сейчас. Изнутри 1-го процесса я вызываю sys.exit(), ведьма «деактивирует процесс». В основном процессе у меня есть al oop, который выглядит так:

while True:
    try:
        None
    except KeyboardInterrupt:
        accelerationrecorder1_process.terminate()
        datasaver_process.terminate()
        sys.exit()
    try:
        if datasaver_process.is_alive() == False:
            accelerationrecorder1_process.terminate()
            sys.exit()
    except:
        sys.exit()

    try:
        if accelerationrecorder1_process.is_alive() == False:
            datasaver_process.terminate()

            sys.exit()
    except:
        sys.exit()

Но если я вызываю sys.exit() в процессе, другой процесс не выполняет exit

1 Ответ

0 голосов
/ 08 августа 2020
Метод

__exit__ magi c не такой, как вы думаете. Он не предназначен для вызова перед завершением вашей программы, но перед тем, как вы покинете блок with. Здесь для более подробной информации об этом.

По сути, у вас не может быть метода, который автоматически вызывается при завершении процесса. Приходится вызывать вручную. Но это все еще возможно. Где-то, предположительно в своей основной функции, вы можете поместить оператор try, чтобы перехватить любое исключение, созданное любой частью вашего приложения (обратите внимание, что sys.exit() вызывает исключение SystemExit, которое будет перехвачено, как и другие исключения), и добавить предложение finally в блоке try, в котором вы вызываете все методы, которые требуются при завершении вашей программы. Пример:

def main():
  try:
    do_thing()
  except:
    log_error()
  finally:
    call_methods()

Не забудьте реализовать функцию log_error (или использовать любую существующую), иначе отладка будет сложной sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...