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判断端口是否打开的实现代码
Feb 10 Python
python模拟鼠标拖动操作的方法
Mar 11 Python
在Python的Flask框架下收发电子邮件的教程
Apr 21 Python
Python中的lstrip()方法使用简介
May 19 Python
python计算文本文件行数的方法
Jul 06 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
使用 Python 处理 JSON 格式的数据
Jul 22 Python
python+django+rest框架配置创建方法
Aug 31 Python
Python更新所有已安装包的操作
Feb 13 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
Python Serial串口基本操作(收发数据)
Nov 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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP parse_url 一个好用的函数
2009/10/03 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
JSON JQUERY模板实现说明
2010/07/03 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
python处理cookie详解
2014/02/07 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
python访问抓取网页常用命令总结
2017/04/11 Python
Python实现读取json文件到excel表
2017/11/18 Python
scrapy爬虫实例分享
2017/12/28 Python
pycham查看程序执行的时间方法
2018/11/29 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
办加油卡单位介绍信
2014/01/09 职场文书
项目合作意向书范本
2014/04/01 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
ant design vue的form表单取值方法
2022/06/01 Vue.js