~~并发编程(十三):信号量,Event,定时器~~
进击のpython
*****
并发编程——信号量,Event,定时器
本节需要了解的就是:
信号量,以及信号量和互斥锁的区别
了解时间和定时器,以及使用
信号量
信号量也是锁,本质没有变!但是他跟互斥锁同一时间只能有一个任务抢到锁去执行来说
信号量同一时间可以有很多个任务拿到锁去执行
如果说互斥锁是一帮人抢一个厕所,那信号量就是一帮人抢夺多个厕所
def func():
with sm:
print('%s get sm' % threading.current_thread().getName())
time.sleep(3)
if __name__ == '__main__':
sm = Semaphore(5)
for i in range(23):
t = Thread(target=func)
t.start()
上面的代码可能对with不够了解,作为上下文管理,也可以用在开关锁上,就像文件的打开关闭一样
- Semaphore管理一个内置的计数器,
- 每当调用acquire()时内置计数器+1
- 调用release() 时内置计数器-1
- 计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()
Event事件
线程的关键特性是每个线程都是独立运行的,且状态都是深不可测的
如果需要根据A线程的运行状态来确定B进程是否运行,那可就太难了
为了解决这个问题,我们就需要Event对象,他可以设置一个标志
等到代码执行到你想要的状态的时候,他就把这个状态设置为真
你就可以接受这个状态然后执行
他有一些方法:
event.isSet():返回event的状态值;
event.wait():如果 event.isSet()==False将阻塞线程;
event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
event.clear():恢复event的状态值为False
import time
from threading import Thread, Event
def A():
print("我是A线程,我在等待B线程执行结束.. ..")
event.wait()
print("我是A线程,我执行完了!")
def B():
print('我是B线程,我要开始执行了.. .. ')
time.sleep(1)
print('我是B线程,我执行完了!')
event.set()
if __name__ == '__main__':
event = Event()
t1 = Thread(target=A)
t2 = Thread(target=B)
t1.start()
t2.start()
执行结果如下:
我是A线程,我在等待B线程执行结束.. ..
我是B线程,我要开始执行了.. ..
我是B线程,我执行完了!
我是A线程,我执行完了!
可以看到,尽管A先执行的,
但是后面的代码是在等待着B的执行完毕才执行
所以我们的目的达到了
定时器
程序n秒之后执行
import time
from threading import Thread, Event, Timer
def A():
print("我是A线程,我在等待B线程执行结束.. ..")
event.wait()
print("我是A线程,我执行完了!")
def B():
print('我是B线程,我要开始执行了.. .. ')
time.sleep(1)
print('我是B线程,我执行完了!')
event.set()
def func():
print("都执行完了该我了!", time.time() - start_time)
if __name__ == '__main__':
event = Event()
t = Timer(3, func) # 定时器,3s后执行func
t1 = Thread(target=A)
t2 = Thread(target=B)
start_time = time.time()
t.start() # 发信号
t1.start()
t2.start()
我是A线程,我在等待B线程执行结束.. ..
我是B线程,我要开始执行了.. ..
我是B线程,我执行完了!
我是A线程,我执行完了!
都执行完了该我了! 3.0026462078094482
*****
*****
~~并发编程(十三):信号量,Event,定时器~~的更多相关文章
- 11 并发编程-(线程)-信号量&Event&定时器
1.信号量(本质也是一把锁)Semaphore模块 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行, 信号量同一时间可以有5个任务拿到锁去执行, 如果说互斥锁是合租 ...
- 多线程《七》信号量,Event,定时器
一 信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群 ...
- [Boost基础]并发编程——asio网络库——定时器deadline_timer
asio库基于操作系统提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植的异步(或者同步)IO操作,而且并不要求使用多线程和锁定,有些的避免了多线程编程带来的诸多有害副作用(如条件竞争 ...
- python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
(1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...
- Java并发编程--5.信号量和障碍器
Semaphore信号量 简介 它本质上是一个共享锁,限制访问公共资源的线程数目,它也被称为计数信号量acquire()许可一个线程, Semaphore – 1; 没有可用的许可时,Semaphor ...
- python网络编程--管道,信号量,Event,进程池,回调函数
1.管道 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行任务修改,即串行修改,速度慢了,但牺牲了速度却保证了数据安全. 文件共享数据实现进程间的通信,但问题是: 1.效率低(共享 ...
- python 之 并发编程(线程Event、协程)
9.14 线程Event connect线程执行到event.wait()时开始等待,直到check线程执行event.set()后立即继续线程connect from threading impor ...
- [java并发编程]基于信号量semaphore实现限流器
目录 一.什么是信号量 二.信号量类Semaphore 三.实现限流器 欢迎关注我的博客,更多精品知识合集 一.什么是信号量 "信号量"在编程术语中使用单词semaphore,那什 ...
- python 并发编程 多线程 信号量
一 信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行 如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群 ...
随机推荐
- mybatis源码配置文件解析之五:解析mappers标签(解析XML映射文件)
在上篇文章中分析了mybatis解析<mappers>标签,<mybatis源码配置文件解析之五:解析mappers标签>重点分析了如何解析<mappers>标签中 ...
- HTML重构与网页常用工具
下面这张思维导图,是我对全书大体内容的一个概括性总结: 工具 本书推荐的工具主要包含的是自动化测试,但是我觉得现行的开发环节当中实际用到的会比较少.这里就推荐一下其他方面的优秀工具: 1. YSlow ...
- sql server 分组查询结合日期模糊查询
分组查询: https://www.cnblogs.com/netserver/p/4518995.html 日期格式化格式: http://blog.csdn.net/qq_16769857/art ...
- 学习 Spring Boot 知识看这一篇就够了
从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区.我的博客和我的公号内.粗略的统计了一下总共的文章加起来大概有六十多篇了,其 ...
- Sharepoint 编辑WebPart时,WebPart属性为灰色不可用
一般在客户端设置就是灰色的,解决方法就是,要在服务器上进行设置,就可以了.:)
- java语言基础(四)_面向对象_类_对象_封装_构造
面向对象 Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计.开发计算机程序. 这里的对象泛指现实中一切事物,每种事物都具备 ...
- 「区间DP」「洛谷PP3146 」[USACO16OPEN]248 G
[USACO16OPEN]248 G 题目: 题目描述 Bessie likes downloading games to play on her cell phone, even though sh ...
- pythonl操作数据库
目录 今日内容详细 Navicat软件 提示 练习题 pymysql模块 sql注入 navicat可视化界面操作数据库 数据库查询题目讲解(多表操作) python如何操作MySQL(pymysql ...
- python入门006
一:可变与不可变类型 可变类型:值改变,id不变,证明改的是原值,证明原值是可以被改变的 不可变类型:值改变,id也变了,证明是产生新的值,压根没有改变原值,证明原值是不可以被修改的 2.验证 2.1 ...
- git解决本地建立git仓库 连接远程git仓库出现拒绝合并问题
(git解决本地建立git仓库 连接远程git仓库出现拒绝合并问题) 第一步在本地创建仓库 在本地创建一个文件夹,cd 进入创建的文件夹之后 git init 创建仓库 ,ls -a 能够看到 .gi ...