python判断线程结束_如何检测线程是否已终止,然后重新启动它?

本文探讨了一种在Python应用程序中处理线程异常并仅重启失败线程的方法。作者分享了一个示例代码,展示了如何检测线程死亡、使用is_alive()和is_active()检查,以及遇到的问题。讨论了是否应使用多进程代替,并给出了可能的解决方案和改进策略。
摘要由CSDN通过智能技术生成

我有一个可以触发一系列线程的应用程序。有时,其中一个线程会死掉(通常是由于网络问题)。如何正确检测线程崩溃并仅重新启动该线程?下面是示例代码: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,因此我永远无法看到线程死亡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值