锁定方法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中的非阻塞使用互斥锁相关推荐

  1. python中的 同步与异步 互斥锁 和 死锁

    同步与异步: 同步:指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去. 异步:指进程不需要一直等下去,而是继续执行下面的操 ...

  2. python无限循环语句的代码_如何在Python中实现非阻塞无限循环

    我有一个无限循环,从网络摄像头读取视频帧,每个帧将通过一个复杂的功能,需要高计算能力.因此,当显示帧时,由于阻塞代码,程序会感觉有点迟钝. 我现在打算做的是, >仅在目标对象出现时收集前几帧 & ...

  3. 深入理解Python中的GIL(全局解释器锁)。

    Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁).这篇 ...

  4. 深入理解Python中的GIL(全局解释器锁)

    前言:本博文主要讲解Python中的GIL(全局解释器锁),本人经过查阅多个资料,摒弃一些较官方的描述,用自己的语言整理并加以补充,如果有描述有误的地方,还望读者在评论区指出,谢谢! 文章目录 一.G ...

  5. 【Python进阶学习】gRPC在Python的异步非阻塞实现方式

    gRPC在Python的异步非阻塞实现方式 前言 问题&分析 问题阐述 原因分析 解决方案 服务端 原服务端实现方式 aio的服务端实现方式: 客户端 异步非阻塞方式 同步阻塞方式 性能优化效 ...

  6. Python中的非可变型的数据类型(immutable type)

    1 致谢 感谢 Ned Batchelder博士的讲授, 视频链接如下: https://www.youtube.com/watch?v=_AEJHKGk9ns 2 Python中的非可变型的数据类型 ...

  7. python中showinfo_python – Tkinter中的非阻塞信息对话框

    我需要一个简单的信息框来显示一些状态输出,我可以使用print将其转储到控制台.我找到的最简单的可能性如下: import Tkinter as tk root = tk.Tk() root.with ...

  8. python 网络编程----非阻塞或异步编程

    From: http://blog.chinaunix.net/uid-20730371-id-765038.html 非阻塞或异步编程 例如,对于一个聊天室来说,因为有多个连接需要同时被处理,所以很 ...

  9. python中的多线程 GIL(全局解释器锁) 死锁与递归锁

    1.什么的是线程 在程序里一个执行路线就叫做线程,线程是程序执行的最小单位 2.多线程的优点 使用线程可以把占据长时间的程序中的任务放到后台去处理. 在处理I/O密集程序的运行速度可能加快(ps:计算 ...

最新文章

  1. 拿来就能用! CTO 创业技术栈指南!
  2. 贴别人的一个文件加密程序!
  3. Windows Server 2016 Technical Preview 5 X64 中文版下载地址
  4. 如何 0 改造,让单体/微服务应用成为 Serverless Application
  5. “雏鹰”的最近感想……
  6. $.cookie is not a function
  7. 网易前端微专业,JavaScript程序设计基础篇:数组
  8. 高德地图定位精度多少米_中美俄卫星定位精度分别是多少?美0.1米,俄10米,中国呢?...
  9. java比较时间的先后utc时间,日期、时间与UTC
  10. Java 获取 URL 响应头信息
  11. php session gc_maxlifetime,PHPsession 有效期 session.gc_maxlifetime
  12. Win10如何彻底删除360的办法
  13. java环境安装教程_java环境搭建教程
  14. 上传文件submit提交form表单 success返回数据多了div获取不到正确的返回数据
  15. Interactive Path Reasoning on Graph for Conversational Recommendation阅读笔记
  16. 如何重新设置苹果id密码_苹果手机ID密码忘了?别着急,这二种方法轻松帮你搞定!...
  17. Win 10上帝模式 的开启和高级隐藏文件
  18. MatLab矩阵的创建、寻访和运算
  19. spring全集 - - - 第五章RESTful开发
  20. 【VMware】虚拟机不能全屏的解决方法

热门文章

  1. java异常个人理解
  2. centos6.9系列LNMP环境的安装
  3. 动态路由选择协议(二)距离矢量路由选择协议
  4. 6.openldap客户端安装
  5. PyCharm 5 破解注册方法
  6. 解决“第一次偶然出现的异常”问题
  7. 02. Creating a Web Forms User Interface
  8. 排序算法之选择法排序(Java)
  9. Linux物理内存初始化
  10. mysql online ddl 5.6_MySQL 5.6的Online DDL功能测试