Управление потоками в Python

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

Значит, в этом фрагменте кода что-то не так ...

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

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

Андер.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Andermutu 13.09.2018 17:12

Другие вопросы по теме