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语言中的按位运算符
Nov 26 Python
python登陆asp网站页面的实现代码
Jan 14 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
详解Python在七牛云平台的应用(一)
Dec 05 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 Python
python 定义类时,实现内部方法的互相调用
Dec 25 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
Sep 03 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 Python
Python实现Matplotlib,Seaborn动态数据图
May 06 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
PHP获取文件后缀名的三个函数
2012/10/15 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
javascript下function声明一些小结
2007/12/28 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
javascript兼容性(实例讲解)
2017/08/15 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
python 异常处理总结
2016/10/18 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
python实现排序算法解析
2018/09/08 Python
Python while true实现爬虫定时任务
2020/06/08 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
五四青年节演讲稿
2014/05/26 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书
Redis三种集群模式详解
2021/10/05 Redis
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers