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程序代码的几种方法总结
Apr 28 Python
python中引用与复制用法实例分析
Jun 04 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 Python
详解Python map函数及Python map()函数的用法
Nov 16 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
matplotlib给子图添加图例的方法
Aug 03 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
Oct 22 Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
python调用接口的4种方式代码实例
Nov 19 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 Python
python 使用pandas读取csv文件的方法
Dec 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构造函数实例讲解
2013/11/13 PHP
php实现发送微信模板消息的方法
2015/03/07 PHP
ThinkPHP控制器详解
2015/07/27 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
sina的lightbox效果。
2007/01/09 Javascript
node.js中watch机制详解
2014/11/17 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
Angular2 组件交互实例详解
2017/08/24 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
django框架自定义用户表操作示例
2018/08/07 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
pandas 空数据处理方法详解
2019/11/02 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
外企财务年会演讲稿
2014/01/03 职场文书
适用于所有创业者的创业计划书
2014/02/05 职场文书
商业房地产广告语
2014/03/13 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
安全施工责任书
2014/08/25 职场文书
毕业设计论文评语
2014/12/31 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书