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实现的DES加密算法和3DES加密算法实例
Jun 03 Python
Python 基础知识之字符串处理
Jan 06 Python
python版简单工厂模式
Oct 16 Python
python smtplib模块实现发送邮件带附件sendmail
May 22 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
python print出共轭复数的方法详解
Jun 25 Python
Python+Redis实现布隆过滤器
Dec 08 Python
解决导入django_filters不成功问题No module named 'django_filter'
Jul 15 Python
python如何实现图片压缩
Sep 11 Python
python爬虫--selenium模块
Mar 31 Python
用Python生成会跳舞的美女
Jan 18 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
地摊中国 - 珍藏老照片
2020/08/18 杂记
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
php面向对象值单例模式
2016/05/03 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
python抓取网页内容示例分享
2014/02/24 Python
Python字符串中查找子串小技巧
2015/04/10 Python
用Python解决计数原理问题的方法
2016/08/04 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
思想政治教育专业个人求职信范文
2013/12/20 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
天坛导游词
2015/02/02 职场文书
人事聘任通知
2015/04/21 职场文书
加薪通知
2015/04/25 职场文书
公诉意见书范文
2015/06/05 职场文书
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python
Go 语言中 20 个占位符的整理
2021/10/16 Golang