我有一个应用程序,它启动了一系列的线程。偶尔会发生其中一个线程死亡(通常是由于网络问题)。我该如何正确检测线程崩溃并重新启动该线程?以下是示例代码:
import random
import threading
import time
class MyThread(threading.Thread):
def __init__(self, pass_value):
super(MyThread, self).__init__()
self.running = False
self.value = pass_value
def run(self):
self.running = True
while self.running:
time.sleep(0.25)
rand = random.randint(0,10)
print threading.current_thread().name, rand, self.value
if rand == 4:
raise ValueError('Returned 4!')
if __name__ == '__main__':
group1 = []
group2 = []
for g in range(4):
group1.append(MyThread(g))
group2.append(MyThread(g+20))
for m in group1:
m.start()
print "Now start second wave..."
for p in group2:
p.start()
在这个例子中,我启动了4个线程,然后又启动了4个线程。每个线程随机生成一个介于0和10之间的int。如果该int是4,则会引发异常。请注意,我没有加入这些线程。我希望group1和group2线程列表都在运行。我发现,如果我加入了这些线程,它将等待直到线程终止。我的线程应该是一个守护进程,因此应该很少(如果有的话)遇到这个示例代码显示的ValueError异常,并且应该一直运行。通过加入它,下一组线程不会开始。
如何检测特定线程已死亡并重新启动该线程?
在我的group2循环结束后,我尝试了以下循环。
while True:
# Create a copy of our groups to iterate over,
# so that we can delete dead threads if needed
for m in group1[:]:
if not m.isAlive():
group1.remove(m)
group1.append(MyThread(1))
for m in group2[:]:
if not m.isAlive():
group2.remove(m)
group2.append(MyThread(500))
time.sleep(5.0)
我从这里获取了此方法。
问题在于isAlive()
似乎总是返回True
,因为线程从未重新启动。
编辑
在这种情况下,使用多进程是否更合适?我找到了这个教程。如果需要重新启动进程,使用单独的进程是否更合适?似乎重新启动线程很困难。
评论中提到我应该对is_active()
和线程进行比较。我没有在文档中看到这一点,但我确实看到了我目前正在使用的isAlive
。如上所述,它返回True
,因此我无法看到线程已死亡。
group1
和group2
列表来跟踪它吗? - NewGuy