python之迭代锁与信号量
如果现在需要在多处加锁大于等于2的时候 因为计算机比较笨,当他锁上一把锁的时候又所理一把锁,等他来开锁的时候他不知道用哪把钥匙来开锁,
所以这个时候我们需要把把平常的锁变为迭代锁
eg:
import threading
import time local = threading.RLock()
# 迭代加锁首先生成实例
def run(name):
global num
local.acquire() # 上锁
num += 1
run2(num)
local.release() # 解锁
print(threading.active_count()) def run2(num):
local.acquire()
num += 1
run3(num)
local.release() def run3(num):
local.acquire()
num+=1
local.release() num = 0
py_res = []
for i in range(50):
t = threading.Thread(target=run,args=('t%s'%i,))
py_res.append(t)
t.start() for i in py_res:
i.join() print("num : %s"% num)
型号量可以控制同线程的个数,和锁的用法一样
import threading
import time
senm = threading.BoundedSemaphore(5)
def run(num):
senm.acquire() # 上锁
time.sleep(2)
print('run the thread %s' % num)
senm.release() # 解锁 for i in range(50):
t = threading.Thread(target=run, args=('%s' % i,))
t.start()
print(threading.active_count()) while threading.active_count() != 1:
pass
else:
print('is done')
信号量:event
标志位 :set,设置标志位 clear 设置标志位,wait 等带标志位,is_set 判断是否设置了标志
下面是一个红绿灯的程序,实现红灯停绿灯行
import threading
import time
event = threading.Event()
# red is have flag or no def light():
count = 0
while True:
if count > 5 and count <= 10:
print('red')
event.set()
elif count > 10:
print('green')
event.clear()
count = 0
else:
print('in the else') time.sleep(1)
count += 1
def car(name):
while True:
if event.is_set():
print('the %s is runing...' % name)
time.sleep(1)
else:
print('%s is wait...' % name)
event.wait() t1 = threading.Thread(target=light)
t1.start()
t2 = threading.Thread(target=car, args=('tesla', ))
t2.start()
python之迭代锁与信号量的更多相关文章
- Python的互斥锁与信号量
并发与锁 a. 多个线程共享数据的时候,如果数据不进行保护,那么可能出现数据不一致现象,使用锁,信号量.条件锁 b. c.互斥锁1. 互斥锁,是使用一把锁把代码保护起来,以牺牲性能换取代码的安全性,那 ...
- Python的并发并行[1] -> 线程[2] -> 锁与信号量
锁与信号量 目录 添加线程锁 锁的本质 互斥锁与可重入锁 死锁的产生 锁的上下文管理 信号量与有界信号量 1 添加线程锁 由于多线程对资源的抢占顺序不同,可能会产生冲突,通过添加线程锁来对共有资源进行 ...
- python之网络编程--锁、信号量、线程、队列
一.线程,可以发现顺序执行比开线程执行时间要短.原因是,一个进程中的多线程处理,由于存在GIL,并且GIL中只能存在一个线程,加上线程又存在切换的问题,所以时间耗得多.想要解决这个问题,是开几个进程, ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- Python GIL、线程锁、信号量及事件
GIL是什么? GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编 ...
- Python并发编程05 /死锁现象、递归锁、信号量、GIL锁、计算密集型/IO密集型效率验证、进程池/线程池
Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密集型效率验证.进程池/线程池 目录 Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密 ...
- 1.gil全局解释器锁, 2. 死锁与递归锁 3. 信号量 4. Event事件 5. 线程queue
gil本质就是一把互斥锁,相当于执行权限,每个进程都会存在一把gil,同一进程内的多个线程必须抢到gil 之后才能使用cpython解释器来执行自己的代码,同一进程下的多线程不能并行,但可以实现并发 ...
- 并发编程 - 线程 - 1.互斥锁/2.GIL解释器锁/3.死锁与递归锁/4.信号量/5.Event事件/6.定时器
1.互斥锁: 原理:将并行变成串行 精髓:局部串行,只针对共享数据修改 保护不同的数据就应该用不用的锁 from threading import Thread, Lock import time n ...
- 并发编程---线程 ;python中各种锁
一,概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 --车间负责把资源整合到 ...
随机推荐
- c语言版去除源代码注释
去除代码中注释需要注意下面几点 首先注释有"/*"开始到"*/"结束的多行或单行注释 其次还有"//"这种单行注释 另外还需要注意双引号和单 ...
- filebeat- 配置
wget https://mirrors.huaweicloud.com/filebeat/7.9.1/filebeat-7.9.1-linux-x86_64.tar.gz tar -zxvf fil ...
- Ubuntu搜狗输入法安装
一.下载sogoupinyin_2.2.0.0108_amd64.deb 二.拷贝到服务器并安装 sudo dpkg -i sogoupinyin_2.2.0.0108_amd64.deb 三.设置搜 ...
- Ubuntu Eclipse启动时报错:A Java RunTime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. No java virtual machine was found after searching the following locations:
此问题起于我在Ubuntu1004上装了两个版本的eclipse:Galieo+helios:卸载前者后出现启动不了eclipse的问题:在网上找了下,可以按如下过程进行解决: Eclipse 3 ...
- Nacos注册中心使用
创建两个工程,一个是nacos-provider, 另一个是naocos-consumer: 添加nacos-provider的依赖 <parent> <groupId>org ...
- webmagic源码浅析
webmagic简介 webmagic可以说是中国传播度最广的Java爬虫框架,https://github.com/code4craft/webmagic,阅读相关源码,获益良多.阅读作者博客[代码 ...
- oracle sql developer 启动java.exe设置错误
1.找到oracle安装目录下的jdk,如:E:\app\Administrator\product\11.2.0\dbhome_1\jdk 2.找到oracle安装目录下的developer路径:E ...
- 《SQL 必知必会》读书笔记
第1课 了解 SQL 这章主要介绍了数据库,表,字段类型,行,列,主键和SQL等基本概念. 数据库:以某种形式存储的数据集合,在计算机上的表现形式可能是一个文件或者一组文件.我们平时所说的数据库,往往 ...
- Linux部署常用命令
1../startup.sh 开启tomcat服务 2.rm -f file1 删除文件 3.rmdir dir xxx 删除目录 4.Tab按钮 自动补全文件名称功能 5.gzip file1 ...
- 【故障公告】访问高峰数据库服务器 CPU 100% 引发全站故障
今天上午11:10,我们又中"奖"了,我们使用的阿里云 RDS 实例(SQL Server 2016 标准版,16核32G)突发出现 CPU 100%,引发全站故障,直到 12:1 ...