用Python控制线程

时间:2018-09-09 09:04:16

标签: python multithreading python-2.7 python-multithreading

我们正在开发一个具有多个线程的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开始)仍然存在。
  线程(线程2,始于1943008368)仍然存在。
  线程(线程3,从1926231152开始)仍然存在。
  线程(线程4,始于1934619760)仍然存在。
  线程(线程5,始于1961882736)仍然存在。
  线程(线程6,始于1951396976)仍然存在。
  线程(线程7,始于1971758192)仍然存在。
  线程(线程9,始于1982223472)仍然存在。

问题是我们已经看到,当线程由于某种原因中断时,我共享的代码段尝试再次启动该线程,但是由于以下错误而崩溃:

  

线程只能启动一次

所以这段代码一定有问题...

任何想法或建议都受到高度赞赏。

预先感谢;

安德。

1 个答案:

答案 0 :(得分:1)

您应该处理线程内部的异常,而不是尝试重新启动它。您可以查看文档:{​​{3}}

这样做更加简单和Pythonic。

实际上,您无法重新启动线程,并且大多数平台都不支持该线程。

线程完成后,其堆栈已死;其父将被标记或发出信号;一旦加入,其资源将被删除。要重新启动它,您需要重新创建所有内容。如果创建新线程,这会更容易。

您可以创建一个重新创建线程的子类:

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()