Мы разрабатываем программу Python 2.7, которая имеет несколько потоков. Мы также создали поток, который следит за тем, чтобы все потоки работали правильно. По сути, это так просто:
all_my_threads = [controlador, usb, telegram, watch, registro, pantalla, hilo1, auto, authentication]
while True:
for thread in all_my_threads:
if (thread.isAlive()):
print (str(thread) + " is alived.")
else:
print (str(thread) + " is not alived.")
print ("Stating " + str(thread) + " thread.")
thread.start()
time.sleep(15)
Когда все потоки запущены, мы получаем:
Thread(Thread-1, started 1943008212) is alived.
Thread(Thread-2, started 1943008368) is alived.
Thread(Thread-3, started 1926231152) is alived.
Thread(Thread-4, started 1934619760) is alived.
Thread(Thread-5, started 1961882736) is alived.
Thread(Thread-6, started 1951396976) is alived.
Thread(Thread-7, started 1971758192) is alived.
Thread(Thread-9, started 1982223472) is alived.
Проблема в том, что мы видели, что когда поток по какой-либо причине прерывается, фрагмент кода, которым я поделился, пытается снова запустить поток, но он вылетает с этой ошибкой:
threads can only be started once
Значит, в этом фрагменте кода что-то не так ...
Любая идея или предложение приветствуются.
Заранее спасибо;
Андер.
Лучше обрабатывать исключения внутри потока, чем пытаться его перезапустить. Вы можете проверить документацию: https://docs.python.org/2/tutorial/errors.html
Это сделать гораздо проще и питоннее.
Фактически вы не можете перезапустить поток, и большинство платформ его не поддерживают.
Когда поток завершается, его стек мертв; его родитель будет отмечен флажком или сигналом; после присоединения его ресурсы стираются. Чтобы перезапустить его, вам нужно все воссоздать. Что будет проще, если вы создадите новую ветку.
Вы можете создать свой подкласс, который воссоздает потоки:
class RestartThread(threading.Thread):
def __init__(self, *args, **kwargs):
self._args, self._kwargs = args, kwargs
super().__init__(*args, **kwargs)
def clone(self):
return RestartThread(*args, **kwargs)
и теперь вы можете клонировать свой поток в случае возникновения исключения:
if not test_thread.is_alive():
test_thread = test_thread.clone()
Спасибо, но не могли бы вы помочь мне реализовать ваш класс RestartThread для моей цели? Я не очень хорошо знаком с классами и не знаю, как их правильно называть. Поэтому я получаю ошибку при выполнении my_thread.clone ()