Python线程下使用锁的技巧分享


Posted in Python onSeptember 13, 2018

使用诸如Lock、RLock、Semphore之类的锁原语时,必须多加小心,锁的错误使用很容易导致死锁或相互竞争。依赖锁的代码应该保证当出现异常时可以正常的释放锁。

典型代码如下:

try:
  lock.acquire()
  #关键部分
  ...
finally:
  lock.release()

另外,所有种类的锁还支持上下文管理协议(写起来更简洁):

with语句自动获取锁,并且在控制流离开上下文时自动释放锁。

with lock:
  #关键部分
  ...

此外,编写代码时一般应该避免同时获取多个锁,例如下面就应该尽量避免:

这通知很统一导致应用程序神秘死锁,尽管与集中策略可以避免出现这种情况(如分层锁定),但是最好在编写代码时避免这种嵌套锁。

with lock_A:
  #关键部分
  ...
  with lock_B:
    #B的关键部分
    ...

尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式:即将多线程程序组织为多个独立任务的集合,这些任务之间通过消息队列进行通信,例如下面要讲的queue模块。

Python 相关文章推荐
python生成器的使用方法
Nov 21 Python
python实现带验证码网站的自动登陆实现代码
Jan 12 Python
利用Python绘制数据的瀑布图的教程
Apr 07 Python
python3使用urllib模块制作网络爬虫
Apr 08 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
Python常用算法学习基础教程
Apr 13 Python
Python中index()和seek()的用法(详解)
Apr 27 Python
python numpy函数中的linspace创建等差数列详解
Oct 13 Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
python重要函数eval多种用法解析
Jan 14 Python
opencv 查找连通区域 最大面积实例
Jun 04 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
Sep 13 #Python
python中字符串内置函数的用法总结
Sep 13 #Python
浅析python继承与多重继承
Sep 13 #Python
Python中分支语句与循环语句实例详解
Sep 13 #Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 #Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 #Python
Python爬虫常用小技巧之设置代理IP
Sep 13 #Python
You might like
使用php+xslt在windows平台上
2006/10/09 PHP
一个ubbcode的函数,速度很快.
2006/10/09 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
js实现鼠标单击Tab表单切换效果
2018/05/16 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
Python 查看文件的编码格式方法
2017/12/21 Python
python爬取哈尔滨天气信息
2018/07/14 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
酒店管理专业学生求职信
2013/09/27 职场文书
化工专业推荐信范文
2013/11/28 职场文书
致400米运动员广播稿
2014/02/07 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
光荣之路观后感
2015/06/12 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL