python中的非阻塞使用互斥锁
锁定方法acquire可以有一个blocking参数。
如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True)
如果设定blocking为False,则当前线程不会堵塞
from threading import Thread, Lock
import time
num =0 # 资源竞争问题
mutex= Lock() # 创建一个互斥锁
def fun1():
global num
for i in range(1000000):
while True:
# mutex.acquire(blocking=False) # 通过blocking参数,如果设置为True表示acquire函数属于阻塞方式,否则,非阻塞方法
result =mutex.acquire(False) # 通过blocking参数,如果设置为True表示acquire函数属于阻塞方式,否则,非阻塞方法
# acquire返回值result的含义
# 如果返回True,表示上锁成功 (意思是,锁原本处于未上锁状态,此次调用成功将锁设置为上锁状态)
# 如果返回False, 表示上锁失败 (意思是,锁原本就属于上锁状态,此次调用再想上锁是不能完成)
if result:
# result为True,表示成功上锁,可以修改资源
num += 1
mutex.release() # 释放锁,表示将锁设置为打开状态
break
else:
# result为False,表示没有成功上锁,所以尝试下一次操作
print("线程1 虽然没有拿到锁,但是可以唱歌")
time.sleep(0.1)
def fun2():
global num
for i in range(1000000):
while True:
result = mutex.acquire(False)
if result:
num += 1
mutex.release() # 释放锁,表示将锁设置为打开状态
break
else:
print("线程2 虽然没有拿到锁,但是可以跳舞")
time.sleep(0.1)
t1 =Thread(target=fun1) # 创建一个线程对象
t2 =Thread(target=fun2) # 创建一个线程对象
t1.start() # 开启线程的执行
t2.start()
t1.join() # 回收线程资源
t2.join()
print(num)
上锁解锁过程
当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。
每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“阻塞”,直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。
线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。
锁的好处:
确保了某段关键代码只能由一个线程从头到尾完整地执行
锁的坏处:
阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁
python中的非阻塞使用互斥锁相关推荐
- python中的 同步与异步 互斥锁 和 死锁
同步与异步: 同步:指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去. 异步:指进程不需要一直等下去,而是继续执行下面的操 ...
- python无限循环语句的代码_如何在Python中实现非阻塞无限循环
我有一个无限循环,从网络摄像头读取视频帧,每个帧将通过一个复杂的功能,需要高计算能力.因此,当显示帧时,由于阻塞代码,程序会感觉有点迟钝. 我现在打算做的是, >仅在目标对象出现时收集前几帧 & ...
- 深入理解Python中的GIL(全局解释器锁)。
Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁).这篇 ...
- 深入理解Python中的GIL(全局解释器锁)
前言:本博文主要讲解Python中的GIL(全局解释器锁),本人经过查阅多个资料,摒弃一些较官方的描述,用自己的语言整理并加以补充,如果有描述有误的地方,还望读者在评论区指出,谢谢! 文章目录 一.G ...
- 【Python进阶学习】gRPC在Python的异步非阻塞实现方式
gRPC在Python的异步非阻塞实现方式 前言 问题&分析 问题阐述 原因分析 解决方案 服务端 原服务端实现方式 aio的服务端实现方式: 客户端 异步非阻塞方式 同步阻塞方式 性能优化效 ...
- Python中的非可变型的数据类型(immutable type)
1 致谢 感谢 Ned Batchelder博士的讲授, 视频链接如下: https://www.youtube.com/watch?v=_AEJHKGk9ns 2 Python中的非可变型的数据类型 ...
- python中showinfo_python – Tkinter中的非阻塞信息对话框
我需要一个简单的信息框来显示一些状态输出,我可以使用print将其转储到控制台.我找到的最简单的可能性如下: import Tkinter as tk root = tk.Tk() root.with ...
- python 网络编程----非阻塞或异步编程
From: http://blog.chinaunix.net/uid-20730371-id-765038.html 非阻塞或异步编程 例如,对于一个聊天室来说,因为有多个连接需要同时被处理,所以很 ...
- python中的多线程 GIL(全局解释器锁) 死锁与递归锁
1.什么的是线程 在程序里一个执行路线就叫做线程,线程是程序执行的最小单位 2.多线程的优点 使用线程可以把占据长时间的程序中的任务放到后台去处理. 在处理I/O密集程序的运行速度可能加快(ps:计算 ...
最新文章
- 拿来就能用! CTO 创业技术栈指南!
- 贴别人的一个文件加密程序!
- Windows Server 2016 Technical Preview 5 X64 中文版下载地址
- 如何 0 改造,让单体/微服务应用成为 Serverless Application
- “雏鹰”的最近感想……
- $.cookie is not a function
- 网易前端微专业,JavaScript程序设计基础篇:数组
- 高德地图定位精度多少米_中美俄卫星定位精度分别是多少?美0.1米,俄10米,中国呢?...
- java比较时间的先后utc时间,日期、时间与UTC
- Java 获取 URL 响应头信息
- php session gc_maxlifetime,PHPsession 有效期 session.gc_maxlifetime
- Win10如何彻底删除360的办法
- java环境安装教程_java环境搭建教程
- 上传文件submit提交form表单 success返回数据多了div获取不到正确的返回数据
- Interactive Path Reasoning on Graph for Conversational Recommendation阅读笔记
- 如何重新设置苹果id密码_苹果手机ID密码忘了?别着急,这二种方法轻松帮你搞定!...
- Win 10上帝模式 的开启和高级隐藏文件
- MatLab矩阵的创建、寻访和运算
- spring全集 - - - 第五章RESTful开发
- 【VMware】虚拟机不能全屏的解决方法