python关闭线程重新运行安装_在Python中重新启动线程

没有理由让你的线死。

如果他们真的崩溃了,你的整个程序都会崩溃。

如果它们只是引发异常,那么您可以捕获异常。

如果他们恢复正常,你就不能这么做。

您甚至可以简单地包装线程函数,以便在出现异常或返回时重新启动自身: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正试图阻止你这样做。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值