位置: 编程技术 - 正文

不要用强制方法杀掉python线程

编辑:rootadmin

推荐整理分享不要用强制方法杀掉python线程,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

前言:

不要试图用强制方法杀掉一个python线程,这从服务设计上就存在不合理性。 多线程本用来任务的协作并发,如果你使用强制手段干掉线程,那么很大几率出现意想不到的bug。 请记住一点,锁资源不会因为线程退出而释放锁资源 !

我们可以举出两个常见的例子:

1. 有个A线程拿到了锁,因为他是被强制干掉的,没能及时的release()释放锁资源,那么导致所有的线程获取资源是都被阻塞下去,这就是典型的死锁场景。

2.在常见的生产消费者的场景下,消费者从任务队列获取任务,但是被干掉后没有把正在做的任务丢回队列中,那么这就造成了数据丢失。

下面是java和python终止线程的方法:

java有三种方法可以使终止线程:

1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。2. 使用stop方法强行终止线程(不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。3. 使用interrupt方法中断线程。

python可以有两种方法:

1. 退出标记2. 使用ctypes强行杀掉线程

不管是python还是java环境下,理想的停止退出线程方法是 让线程自个自杀,所谓的线程自杀就是 你给他一个标志位,他退出线程。

不要用强制方法杀掉python线程

下面我们会采用多种方法来测试 停止python线程的异常情况。我们查看一个进程所有的执行线程, 进程是用过掌控资源,线程是用作调度单元,进程要被调度执行必须要有一个线程,默认的线程和进程的pid一样的。

获取到了进程所有的线程后,通过strace得知 是需要我们kill的线程id,当我们kill的时候,会出现整个进程都崩溃的情况。 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知。也就是说,信号会随机发个该进程的一个线程。

上面出现的问题其实跟pthread的说明是一致的。当我们在python代码里加入 signal 信号处理函数后,回调函数可以防止整个进程的退出,那么问题来了,通过信号函数不能识别你要干掉哪一个线程,也就是说,不能精准的干掉某个线程。你虽然把信号发给线程id,但是信号受理人是所属进程的任何一个,另外传给信号处理函数的参数只有信号数和信号stack而已,可有可无的。

加了信号处理后,不会退出进程

如果想从外部通知杀掉某个线程,那么可以构建使用rpc服务,或者别的方式通信,signal信号不可以,因为无法无法传递更多的信息。

python的线程不是模拟的,是真实的内核线程,内核调用pthread方法,但Python上层没有提供关闭线程的方法,这就需要我们自己把握了。强烈推荐使用 event 或者 自定义标志位的方法, 如果非要强制杀掉线程,那么可以用python ctypes PyThreadState SetAsyncExc 方法强制退出,这样对于运行的python服务没有什么影响。

该函数的实现原理比较简单,其实也是在python虚拟机里做个标示位,然后由虚拟机运行一个异常来取消线程,虚拟机会帮你做好try cache。 切记不要在外部杀掉python的某个线程,虽然你能通过ctypes找到线程id,但是你直接kill会干掉整个进程的。

下面的代码是 用ctypes 杀掉线程的样例,不推荐使用,因为太粗暴了.

咱们简单look一下PyThreadState源代码,总而言之触发线程的异常模式。 有兴趣的人可以阅读 python pystate.c 的设计,配合着youtube的一些视频分享。

原生posix pthread 可以使用 ptread_cancel(tid) 在主线程中结束子线程。但是 Python 的线程库不支持这样做,理由是我们不应该强制地结束一个线程,这样会带来很多隐患,应该让该线程自己结束自己。所以在 Python 中,推荐的方法是在子线程中循环判断一个标志位,在主线程中改变该标志位,子线程读到标志位改变,就结束自己。

类似这个逻辑:

简单的总结,虽然我们可以用ctypes里的pystats来控制线程,但这种粗暴中断线程的方法是不合理的。 请选用 自杀模式 !如果你的线程正在发生io阻塞,而不能判断事件怎么办? 你的程序需要做优化了,最少在网络io层需要有主动的timeout,避免一直的阻塞下去。

python基于itchat实现微信群消息同步机器人 最近全栈数据工程师养成攻略的微信群已经将近人,开了二群之后为了打通不同微信群之间的消息,花了点时间做了个消息同步机器人,在任意群收

详解Python中的静态方法与类成员方法 前言因为Python的水平目前一直是处于能用阶段,平时写的脚本使用的Python的写法也比较的简单,没有写过稍微大一点的项目。对Python中的类,类之间的

python 截取 取出一部分的字符串方法 下面是split截取获得str='

标签: 不要用强制方法杀掉python线程

本文链接地址:https://www.jiuchutong.com/biancheng/380013.html 转载请保留说明!

上一篇:Python实现 多进程导入CSV数据到 MySQL(python怎么多进程)

下一篇:python基于itchat实现微信群消息同步机器人(python itcast)

  • 补做前几年税审对报税税务评级有什么影响?
  • 计提所得税分录计提的时候金额比实际缴纳多
  • 怎样理解一般纳税人
  • 邮政电信业务差距大吗
  • 豆制品属于农产品初加工吗
  • 销售收入与营业费用的配比
  • 提供洒水车服务税率
  • 缓缴税款到期缴纳填主表第几行
  • 员工自己承担的商业保险费是多少
  • 企业微信收款如何同步给别人
  • 符合营改增应税服务规定的有
  • 一次性奖金可以分2次发吗
  • 一般纳税人提供服务税率
  • 低值易耗品进项税额转出账务处理
  • 软件企业两免三减半税收政策到期
  • 刻章发票可以抵税吗
  • 土地闲置费是否可以列入生产成本
  • 承兑汇票章不清晰 情况说明
  • 固定资产报废处理流程图
  • 进项税额能抵扣的几种情形
  • 非现金资产包括
  • 会计审核票据如何签字
  • 苹果系统怎么修改开机密码
  • mac怎么设置不自动开机
  • 鸿蒙系统桌面如何设置
  • 公司注销帐上的钱取出来要交税吗
  • 2020税务预警后如何解除
  • 差额征税的项目有哪些
  • 笔记本通用音频驱动程序怎么修复
  • 交易性金融资产的入账价值怎么算
  • 直布罗陀巨岩山
  • 政府性基金和行政事业性收费区别
  • 报销差旅费会计凭证
  • 在暴风雪中翻译
  • php怎么定义全局变量
  • 业务招待费调增额怎么算
  • 收到快递赔款分录怎么做
  • 装修费用一次性计入成本
  • 可以主营业务成本增加现金减少吗
  • 一般纳税人差额纳税
  • 企业所得税的营业成本包括期间费用吗
  • 非公司员工可以报销差旅费吗
  • 增值税发票怎么领取
  • 无票收入需要缴纳文化事业建设税吗
  • 房产增值税发票可以抵税吗
  • 广告牌制作计入什么科目
  • 财务费用利息属于什么科目
  • 买两个能退一个吗
  • 收到税务局退增值税怎么入账
  • 企业营业利润率怎么算
  • 损益类科目如何填写手工总账
  • 啥叫合同
  • 什么是小规模纳税人2023
  • 临建费用包含在哪里
  • 银行日记账怎么导出
  • 生产费用明细账
  • mysql 5.7.28安装
  • sql实用教程
  • debian9.6安装教程
  • sql server分页查询sql语句
  • MySQL使用select语句查询指定表中指定列(字段)的数据
  • linux路由是干嘛的
  • gitlab linux
  • win10系统锁屏后输入密码一直转圈进不去桌面
  • win10系统d盘变成e盘,进入winpe盘符正常
  • centos8设置默认启动命令界面
  • Win10 Mobile Redstone版本号确定为Build 11082明年发布
  • linux系统中在给定文件中查找与设定条件
  • Android SQLite总结(一)
  • jquery使用教程
  • 安卓手机管家是什么
  • jquery移动版
  • pythontrutle
  • android开发框架mvp
  • 上海市国家税务局地址
  • 国家税务总局广州市税务局
  • 粮仓计算公式
  • 福建省地方税务局领导名单
  • 发票开票系统可以查询上一年发票吗?
  • 微山湖到底属于哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设