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获取本机外网ip的方法
Apr 15 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
浅析PHP与Python进行数据交互
May 15 Python
python验证码识别教程之滑动验证码
Jun 04 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
pandas ix &iloc &loc的区别
Jan 10 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
python 为什么说eval要慎用
Mar 26 Python
python下载库的步骤方法
Oct 12 Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 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 深入理解strtotime函数的使用详解
2013/05/23 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
js实现星星打分效果
2020/07/05 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
Django中的FBV和CBV用法详解
2019/09/15 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
Python 如何查找特定类型文件
2020/08/17 Python
Joules美国官网:出色的英国风格
2017/10/30 全球购物
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
一道写SQL的面试题和答案
2013/11/19 面试题
给国外客户的邀请函
2014/01/30 职场文书
大一新生学期自我评价
2014/04/09 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
装修安全责任协议书
2016/03/22 职场文书
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技