没有理由让你的线死。
如果他们真的崩溃了,你的整个程序都会崩溃。
如果它们只是引发异常,那么您可以捕获异常。
如果他们恢复正常,你就不能这么做。
您甚至可以简单地包装线程函数,以便在出现异常或返回时重新启动自身:def threadwrap(threadfunc):
def wrapper():
while True:
try:
threadfunc()
except BaseException as e:
print('{!r}; restarting thread'.format(e))
else:
print('exited normally, bad thread; restarting')
return wrapper
thread_dict = {
'a': threading.Thread(target=wrapper(a), name='a'),
'b': threading.Thread(target=wrapper(b), name='b')
}
问题解决了。无法重新启动线程。
大多数平台都无法做到这一点。
从概念上讲,这没有任何意义。当一个线程完成时,它的堆栈就死了;其父线程被标记或发出信号;一旦它加入,它的资源就被销毁(包括内核级的资源,比如它的进程表条目)。重新启动它的唯一方法是创建一整套新的东西。你可以通过创建一个新的线程来完成。
所以,就这么做吧。如果您真的不想在内部处理异常,只需存储构造参数并使用它们启动一个新线程。
你甚至可以创建自己的子类来挂载它们:class RestartableThread(threading.Thread):
def __init__(self, *args, **kwargs):
self._args, self._kwargs = args, kwargs
super().__init__(*args, **kwargs)
def clone(self):
return RestartableThread(*args, **kwargs)
现在很容易“复制”线程(使用您想要的语义):if not a_thread.is_alive():
a_thread = a_thread.clone()是的,threading.Thread对象不可安全复制
你认为会发生什么?充其量,在同一个操作系统级线程对象周围会有不同的包装器,所以你会愚弄Python,使其没有注意到你正在试图做非法的、可能导致segfult的事情,而Python正试图阻止你这样做。