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中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
用Python解决计数原理问题的方法
Aug 04 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 Python
Tensorflow之Saver的用法详解
Apr 23 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
Python传递参数的多种方式(小结)
Sep 18 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 Python
Python定时任务框架APScheduler原理及常用代码
Oct 05 Python
matplotlib教程——强大的python作图工具库
Oct 15 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
Dec 04 Python
Python中递归以及递归遍历目录详解
Oct 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
smarty实例教程
2006/11/19 PHP
php简单静态页生成过程
2008/03/27 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
javascript 流畅动画实现原理
2009/09/08 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
500行python代码实现飞机大战
2020/04/24 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
公司募捐倡议书
2014/05/14 职场文书
平安建设工作方案
2014/06/02 职场文书
委托书怎样写
2014/08/30 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
综合测评个人总结
2015/03/03 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python