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 encode和decode的妙用
Sep 02 Python
python with statement 进行文件操作指南
Aug 22 Python
Python使用pandas对数据进行差分运算的方法
Dec 22 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
python jenkins 打包构建代码的示例代码
Nov 29 Python
python操作cfg配置文件方式
Dec 22 Python
Python3 A*寻路算法实现方式
Dec 24 Python
Python3将ipa包中的文件按大小排序
Apr 17 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
重构Python代码的六个实例
Nov 25 Python
Python使用socket去实现TCP客户端和TCP服务端
Apr 12 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中,文件上传
2006/12/06 PHP
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
15 个 JavaScript Web UI 库
2010/05/19 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
使用Python实现画一个中国地图
2019/11/23 Python
python实现局域网内实时通信代码
2019/12/22 Python
python装饰器的特性原理详解
2019/12/25 Python
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
创业计划书——互联网商机
2014/01/12 职场文书
暑期学习心得体会
2014/09/02 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
家属慰问信
2015/02/14 职场文书
班主任高考寄语
2015/02/26 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书