对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 相关文章推荐
Python写的PHPMyAdmin暴力破解工具代码
Aug 06 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
python如何通过protobuf实现rpc
Mar 06 Python
python dict.get()和dict['key']的区别详解
Jun 30 Python
Python的多维空数组赋值方法
Apr 13 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
Pandas读取MySQL数据到DataFrame的方法
Jul 25 Python
TensorFlow实现iris数据集线性回归
Sep 07 Python
Django框架模板用法入门教程
Nov 04 Python
django model通过字典更新数据实例
Apr 01 Python
Python定时任务框架APScheduler原理及常用代码
Oct 05 Python
用python对excel进行操作(读,写,修改)
Dec 25 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
PHP封装的字符串加密解密函数
2015/12/18 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
JavaScript获取页面中表单(form)数量的方法
2015/04/03 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
python如何重载模块实例解析
2018/01/25 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
python如何保证输入键入数字的方法
2019/08/23 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
linux面试题参考答案(7)
2012/10/29 面试题
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
机械工程师求职自我评价
2013/09/23 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
学期个人工作总结
2015/02/13 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫