Управление потоками в Python - PullRequest
0 голосов
/ 09 сентября 2018

Мы разрабатываем программу на 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)

Когда все потоки запущены, мы получаем:

Тема (Тема 1, запущена в 1943008212) активна.
Тема (Thread-2, запущена в 1943008368) активна.
Тема (Thread-3, запущена в 1926231152) жива.
Тема (Thread-4, запущена в 1934619760) активна.
Тема (Thread-5, запущена 1961882736) жива.
Тема (Thread-6, запущено 1951396976) активна.
Поток (Thread-7, запущен в 1971758192) жив.
Тема (Thread-9, запущена 1982223472) жива.

Проблема в том, что мы видели, что когда по какой-либо причине поток прерывает какой-то фрагмент кода, которым я поделился, пытается запустить поток снова, но он вылетает с этой ошибкой:

темы могут быть запущены только один раз

Так что что-то не так в этом куске кода ...

Любая идея или предложение высоко ценится.

Заранее спасибо;

Андер.

1 Ответ

0 голосов
/ 09 сентября 2018

Вы должны скорее обработать исключения внутри потока, чем пытаться перезапустить его. Вы можете проверить документацию: 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()
...