我有一个可以触发一系列线程的应用程序。有时,其中一个线程会死掉(通常是由于网络问题)。如何正确检测线程崩溃并仅重新启动该线程?下面是示例代码: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,则会引发异常。注意,我没有join线程。我希望运行线程的group1和group2列表。我发现如果我加入线程,它会等到线程终止。我的线程应该是一个守护进程,因此应该很少(如果有的话)碰到这个示例代码显示的ValueError异常,并且应该一直运行。通过连接它,下一组线程不会开始。
如何检测到某个特定线程死机并仅重新启动该线程?
我在我的for p in 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)
我从this问题中采用了这种方法。
问题是isAlive()似乎总是返回True,因为线程从不重新启动。
编辑
在这种情况下使用多处理是否更合适?我找到了this教程。如果需要重新启动进程,是否更适合使用单独的进程?重新启动线程似乎很困难。
评论中提到我应该对照线程检查is_active()。我在documentation中没有看到这一点,但我确实看到了当前正在使用的^{}。不过,正如我前面提到的,这返回True,因此我永远无法看到线程死亡。