Python - иметь Родительский поток обрабатывать исключение дочерних потоков



Есть ли способ заставить родителя, породившего новый поток, перехватить исключение порожденных потоков? Ниже приведен реальный базовый пример того, что я пытаюсь сделать. Он должен перестать считать, когда возникает исключение, но я не знаю, как его поймать. Являются ли исключения потокобезопасными? Я хотел бы иметь возможность использовать модуль Subprocess, но я застрял с использованием Python 2.3 и не знаю, как еще это сделать. Возможно, используя модуль threading?



import time
import thread

def test():
try:
test = thread.start_new_thread(watchdog, (5,))
count(10)
except:
print('Stopped Counting')

def count(num):
for i in range(num):
print i
time.sleep(1)

def watchdog(timeout):
time.sleep(timeout)
raise Exception('Ran out of time')

if __name__ == '__main__':
test()


Обновить



Мой оригинал код немного вводил в заблуждение. Он действительно ищет что-то более похожее на это:



import time
import thread
import os

def test():
try:
test = thread.start_new_thread(watchdog, (5,))
os.system('count_to_10.exe')
except:
print('Stopped Counting')

def watchdog(timeout):
time.sleep(timeout)
raise Exception('Ran out of time')

if __name__ == '__main__':
test()


Я пытаюсь создать сторожевого пса, чтобы убить ОС.системный вызов, если программа по какой-то причине зависает.
663   4  

4 ответов:

Почему бы не сделать что-то вроде этого

def test(): 
    def exeption_cb():
        os._exit()
    test = thread.start_new_thread(watchdog, (5, exception_cb))
    os.system('count_to_10.exe')
    print('Stopped Counting')

def watchdog(timeout, callback):
    time.sleep(timeout)
    callback()
Это остановит весь процесс. Еще одна вещь, которую вы можете сделать, это запустить os.система в другом потоке, затем обратный отсчет, а затем убить этот поток. Что-то вроде этого,
def system_call():
    os.system('count_to_10.exe')

system_thread = thread.start_new_thread(system_call)
time.sleep(timeout)
system_thread.kill()

Застрял с помощью Python 2.3

Python 2.3 сейчас как 10 лет. Почему ты до сих пор им пользуешься?

Возможно использование модуля нарезания резьбы

Вы все равно должны использовать threading.

Вы, вероятно, думаете о проблеме неправильно, хотя. Вам, вероятно, следует создать несколько классов и пересмотреть подход к вашей проблеме.

Кроме того, если вы создаете сторожевого пса, вероятно, не имеет особого смысла использовать его в том же процессе как и то, что ты делаешь. время.sleep () - это системный вызов, который обычный python Exception все равно не отменит.

Если то, что вы действительно пытаетесь сделать, это передать / обработать исключение, то я не думаю, что вы хотите использовать подпроцесс, так как родительский процесс может только "видеть" код состояния (и вывод), произведенный дочерним процессом - только в случаях немедленного и катастрофического сбоя в дочернем процессе исключение получает "повторно вызванное" в Родительском: http://docs.python.org/library/subprocess.html#exceptions .

И (опять же, если вы пытаетесь передать / обработать исключение) я не уверен, что вы хотите и нитки тоже. В конце концов, весь смысл (IMO) исключений состоит в том, чтобы иметь что-то, что может быть обработано "вызывающим" (внутри блока try) или может предоставить значимую информацию обратного пути (последовательность вызовов), если не обрабатывается. Ни одна из этих идей на самом деле не работает с "броском" в одном потоке и "ловом" в другом.

Если ваша реальная цель состоит в том, чтобы одна часть логики "тайм-аут" другой, то я думаю, что для вашего "сторожевого пса" имеет смысл быть отдельным процессом - либо "родитель", который отслеживает выходные данные от" потомка "(а также время, прошедшее), или" одноранговый", который" следит " за чем-то вроде строк журнала и/или обновлений БД отслеживаемым процессом (а также часами). Ни в том, ни в другом случае исключения не имеют особого значения. И я рекомендую взглянуть на ответ Алекса Мартелли на этот вопрос: используя модуль 'subprocess' с таймаутом

На этот вопрос также есть несколько хороших ответов, которые имеют отношение к вашему вопросу: поймать исключение потока в вызывающем потоке в Python

Я знаю, что вы застряли с использованием Python 2.3, но если бы вы могли только сделать (очень) скромное продвижение к Python 2.4, то вы могли бы воспользоваться этим более простым подходом, скопированным из ответа Ярослава Булатова на вопрос (рекомендуемое чтение) о запуске внешней команды с таймаутом: Python, Popen и select-ожидание завершения процесса или таймаута

from threading import Timer
from subprocess import Popen, PIPE

def kill_proc():
    proc.kill()

proc = Popen("count_to_10.exe", shell=True)
t = Timer(60, kill_proc)
t.start()
proc.wait()

Это пример родительского процесса, отсчитывающего время выполнения дочернего процесса, как упомянуто в моем предыдущем ответе.

Comments

    Ничего не найдено.