我们正在开发一个具有多个线程的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)仍然存在。
问题是我们已经看到,当线程由于某种原因中断时,我共享的代码段尝试再次启动该线程,但是由于以下错误而崩溃:
线程只能启动一次
所以这段代码一定有问题...
任何想法或建议都受到高度赞赏。
预先感谢;
安德。
答案 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()