python强制停止线程学习

news/2024/11/19 21:29:38/

参考:

Python进阶之路 - Timeout | 超时中断 - 知乎 (zhihu.com)

写的很棒。

这里只记录我摘取的封装的一个class:

#!/usr/bin/env python
# -*- coding: utf-8 -*-import ctypes
import threadingclass ThreadKillOver(RuntimeError):"""线程杀死后的反馈"""def __init__(self):RuntimeError.__init__(self, "ThreadKillOver")class ThreadKiller(threading.Thread):"""separate thread to kill TerminableThread"""def __init__(self, target_thread, exception_cls, repeat_sec=2.0):threading.Thread.__init__(self)self.target_thread = target_threadself.exception_cls = exception_clsself.repeat_sec = repeat_secself.daemon = Truedef run(self):"""loop raising exception incase it's caught hopefully this breaks us far out"""while self.target_thread.is_alive():#ctypes.pythonapi.PyThreadState_SetAsyncExc是Python的ctypes库中的一个函数,# 用于设置Python线程的异步异常。这个函数的第一个参数是一个C语言中的线程状态对象,# 第二个参数是要抛出的异常。这个函数允许你在Python的C API层面控制线程的异常处理,# 通常情况下,你不需要直接使用这个函数,而是让Python的异常处理机制自动处理。ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(self.target_thread.ident),ctypes.py_object(self.exception_cls))self.target_thread.join(self.repeat_sec)class TerminableThread(threading.Thread):"""a thread that can be stopped by forcing an exception in the execution context"""def terminate(self, exception_cls=ThreadKillOver, repeat_sec=1.0):"""一个是exception_cls,这个的含义是,线程结束时会raise哪一种异常;另一个是repeat_sec,这个的含义是,杀手每隔多长时间去确认一次线程有没有死亡。如果repeat_sec为1,则线程杀手会每秒检查一次,如果线程还没死,就再杀一次,知道确认死亡为止。"""if self.is_alive() is False:return Truekiller = ThreadKiller(self, exception_cls, repeat_sec=repeat_sec)killer.start()


http://www.ppmy.cn/news/1103696.html

相关文章

IllegalArgumentException

Caused by: java.lang.IllegalArgumentException:Invalid pulsar service : persistent 参数非法异常 这个异常是由于使用了无效的 Pulsar 服务类型导致的。Pulsar 支持不同的服务类型,例如 persistent、non-persistent 等。 当你在配置 Pulsar 相关的参数时&…

C++之生成key-value键值三种方式(一百九十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

FreeSWITCH recod_session跟静音处理有关的设置

<action application"set" data"record_waste_resourcestrue"/> <action application"set" data"record_fill_cngtrue"/>

C#__线程的优先级和状态控制

线程的优先级&#xff1a; 一个CPU同一时刻只能做一件事情&#xff0c;哪个线程优先级高哪个先运行&#xff0c;优先级相同看调度算法。 在Thread类中的Priority属性&#xff08;Highest,Above,Normal,BelowNormal,Lowest&#xff09;可以影响线程的优先级 关于…

基于Matlab实现多个数字水印案例(附上源码+数据集)

数字水印是一种在数字图像或视频中嵌入特定信息的技术&#xff0c;以保护知识产权和防止盗版。在本文中&#xff0c;我们将介绍如何使用Matlab实现数字水印。 文章目录 实现步骤源码数据集下载 实现步骤 首先&#xff0c;我们需要选择一个用于嵌入水印的图像。这可以是原始图像…

docker启动失败问题解决

docker启动失败问题&#xff1a; 使用journalctl -u docker.service命令排查 [rootharbor ~]# journalctl -u docker.service9月 06 10:02:04 harbor dockerd[6218]: time"2023-09-06T10:02:04.86755742508:00" levelerror msg"getNetworkFromStore for nid 2…

sklearn中make_blobs方法:聚类数据生成器

sklearn中make_blobs()方法参数&#xff1a; n_samples:表示数据样本点个数,默认值100 n_features:是每个样本的特征&#xff08;或属性&#xff09;数&#xff0c;也表示数据的维度&#xff0c;默认值是2。默认为 2 维数据&#xff0c;测试选取 2 维数据也方便进行可视化展示…

Debian11安装MySQL8.0,链接Navicat

图文小白教程 1 下载安装MySQL1.1 从MySQL官网下载安装文件1.2 安装MySQL1.3 登录MySQL 2 配置Navicat远程访问2.1 修改配置2.2 Navicat 连接 end: 卸载 MySQL 记录于2023年9月&#xff0c;Debian11 、 MySQL 8.0.34 1 下载安装MySQL 1.1 从MySQL官网下载安装文件 打开 MySQ…