对python多线程中互斥锁Threading.Lock的简单应用详解


Posted in Python onJanuary 11, 2019

一、线程共享进程资源

每个线程互相独立,相互之间没有任何关系,但是在同一个进程中的资源,线程是共享的,如果不进行资源的合理分配,对数据造成破坏,使得线程运行的结果不可预期。这种现象称为“线程不安全”。

实例如下:

#-*- coding: utf-8 -*-
import threading
import time
 
def test_xc():
  f = open("test.txt","a")
  f.write("test_dxc"+'\n')
  time.sleep(1)
  f.close()
 
if __name__ == '__main__':
  for i in xrange(5):
    t = threading.Thread(target=test_xc)
    t.start()

结果展示:

对python多线程中互斥锁Threading.Lock的简单应用详解

二、互斥锁同步

线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态:锁定/非锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

threading模块中定义了Lock类,可以方便的处理锁定:

#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire([timeout])#timeout是超时时间
#释放
mutex.release()

其中,锁定方法acquire可以有一个超时时间的可选参数timeout。如果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理。

三、使用线程锁

<pre name="code" class="python">#-*- coding: utf-8 -*-
import threading
import time
 
def test_xc():
  f = open("test.txt","a")
  f.write("test_dxc"+'\n')
  time.sleep(1)
  mutex.acquire()#取得锁
  f.close()
  mutex.release()#释放锁
 
if __name__ == '__main__':
  mutex = threading.Lock()#创建锁
  for i in xrange(5):
    t = threading.Thread(target=test_xc)
    t.start()

运行结果

对python多线程中互斥锁Threading.Lock的简单应用详解

以上这篇对python多线程中互斥锁Threading.Lock的简单应用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
Nov 18 Python
Python简单删除目录下文件以及文件夹的方法
May 27 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
Python编程深度学习绘图库之matplotlib
Dec 28 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
详解opencv中画圆circle函数和椭圆ellipse函数
Dec 27 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
python 实现图像快速替换某种颜色
Jun 04 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
python spilt()分隔字符串的实现示例
May 21 Python
pyqt5实现俄罗斯方块游戏
Jan 11 #Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 #Python
对python多线程中Lock()与RLock()锁详解
Jan 11 #Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 #Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 #Python
python通过配置文件共享全局变量的实例
Jan 11 #Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 #Python
You might like
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
python实现图片变亮或者变暗的方法
2015/06/01 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python判断输入日期为第几天的实例
2018/11/13 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
python时间time模块处理大全
2020/10/25 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
教师师德教育的自我评价
2013/10/31 职场文书
大学军训自我鉴定
2013/12/15 职场文书
小学门卫岗位职责
2013/12/17 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python
Nginx实现会话保持的两种方式
2022/03/18 Servers
nginx lua 操作 mysql
2022/05/15 Servers