Как правильно остановить многопроцессорную python-программу после исключения? - PullRequest
7 голосов
/ 26 сентября 2011

У меня есть программа на Python, которая имеет несколько процессов (на данный момент только 2) и потоков (по 2 на процесс).Я хотел бы перехватить каждое исключение и особенно аккуратно завершить работу моей программы по Ctrl + c, но я не могу заставить его работать.Каждый раз, когда возникает исключение, программа останавливается, но не закрывается правильно, оставляя меня с непригодной командной строкой.

То, что я пробовал до сих пор в псевдокоде:

try:
    for process in processes:
        process.join()
except:
    pass #Just to suppress error-messages, will be removed later
finally:
    for process in processes:
        process.terminate()

Но, как я ужесказал без удачи.Также обратите внимание, что я получаю сообщение об ошибке исключения для обоих процессов, поэтому я думаю, что они оба остановлены?

Может быть, я должен также упомянуть, что большинство потоков заблокированы при прослушивании канала.

РЕДАКТИРОВАТЬ Так что я почти получил это работает.Мне нужно было try: каждый поток и убедиться, что потоки соединены правильно.Есть только один недостаток: Exception KeyboardInterrupt in <module 'threading' from '/usr/lib64/python2.7/threading.pyc'> ignored при выключении.Это поднимается в главном потоке основного процесса.Этот поток уже завершен, что означает, что он прошел последнюю строку кода.

1 Ответ

1 голос
/ 27 сентября 2011

Проблема (я ожидаю) состоит в том, что исключения возникают внутри процессов , а не в вызовах соединения.

Я предлагаю вам попробовать включить основной метод каждого процесса в цикл try-Кроме. Затем установите флаг (например, экземпляр multiprocessing.Value), который для оператора where установлен в False. Каждый процесс может проверить значение флага и остановить (очистка после себя), если он установлен в False.

Обратите внимание, что если вы просто прервете процесс, он не будет очищаться после себя, так как это то же самое, что отправить ему SIG_TERM.

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