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 相关文章推荐
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
Python异常处理操作实例详解
May 10 Python
从请求到响应过程中django都做了哪些处理
Aug 01 Python
使用python绘制3维正态分布图的方法
Dec 29 Python
Python第三方库h5py_读取mat文件并显示值的方法
Feb 08 Python
Laravel+Dingo/Api 自定义响应的实现
Feb 17 Python
详解python列表(list)的使用技巧及高级操作
Aug 15 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
如何利用python检测图片是否包含二维码
Oct 15 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
使用Python实现音频双通道分离
Dec 25 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
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
javascript实现移动端上传图片功能
2020/08/18 Javascript
在Python的Django框架中编写编译函数
2015/07/20 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
Python实现多属性排序的方法
2018/12/05 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
印尼太阳百货公司网站:Matahari
2018/02/04 全球购物
P/Invoke是什么
2015/07/31 面试题
车间主管岗位职责
2013/11/14 职场文书
事业单位辞职信范文
2014/01/19 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
企业承诺书怎么写
2014/05/24 职场文书
村道德模范事迹材料
2014/08/28 职场文书
超市开店计划书
2014/09/15 职场文书
2014年内勤工作总结
2014/11/24 职场文书
朋友离别感言
2015/08/04 职场文书
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android