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 相关文章推荐
Django实现自定义404,500页面教程
Mar 26 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
使用Python画了一棵圣诞树的实例代码
Nov 27 Python
Python离线安装openpyxl模块的步骤
Mar 30 Python
python 三边测量定位的实现代码
Apr 22 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
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
php实现求相对时间函数
2015/06/15 PHP
yii数据库的查询方法
2015/12/28 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
2015/12/29 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
学前端,css与javascript重难点浅析
2020/06/11 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
python使用matplotlib绘制柱状图教程
2017/02/08 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
python中的itertools的使用详解
2020/01/13 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
python判断元素是否存在的实例方法
2020/09/24 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
党课学习思想汇报
2014/01/02 职场文书
办理信用卡工作证明
2014/01/11 职场文书
秋季运动会加油稿200字
2014/01/11 职场文书
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
进口业务员岗位职责
2014/04/06 职场文书
作文评语大全
2014/04/23 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书