进击の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不够了解,作为上下文管理,也可以用在开关锁上,就像文件的打开关闭一样

  1. Semaphore管理一个内置的计数器,
  2. 每当调用acquire()时内置计数器+1
  3. 调用release() 时内置计数器-1
  4. 计数器不能小于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,定时器~~的更多相关文章

  1. 11 并发编程-(线程)-信号量&Event&定时器

    1.信号量(本质也是一把锁)Semaphore模块 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行, 信号量同一时间可以有5个任务拿到锁去执行, 如果说互斥锁是合租 ...

  2. 多线程《七》信号量,Event,定时器

    一 信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群 ...

  3. [Boost基础]并发编程——asio网络库——定时器deadline_timer

    asio库基于操作系统提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植的异步(或者同步)IO操作,而且并不要求使用多线程和锁定,有些的避免了多线程编程带来的诸多有害副作用(如条件竞争 ...

  4. python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式

    (1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...

  5. Java并发编程--5.信号量和障碍器

    Semaphore信号量 简介 它本质上是一个共享锁,限制访问公共资源的线程数目,它也被称为计数信号量acquire()许可一个线程, Semaphore – 1; 没有可用的许可时,Semaphor ...

  6. python网络编程--管道,信号量,Event,进程池,回调函数

    1.管道 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行任务修改,即串行修改,速度慢了,但牺牲了速度却保证了数据安全. 文件共享数据实现进程间的通信,但问题是: 1.效率低(共享 ...

  7. python 之 并发编程(线程Event、协程)

    9.14 线程Event connect线程执行到event.wait()时开始等待,直到check线程执行event.set()后立即继续线程connect from threading impor ...

  8. [java并发编程]基于信号量semaphore实现限流器

    目录 一.什么是信号量 二.信号量类Semaphore 三.实现限流器 欢迎关注我的博客,更多精品知识合集 一.什么是信号量 "信号量"在编程术语中使用单词semaphore,那什 ...

  9. python 并发编程 多线程 信号量

    一 信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行 如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群 ...

随机推荐

  1. Codeforces Round #651 (Div. 2)

    感觉自己无可救药了. A题:找到小于等于n的两个不同的数的gcd最大是多少,显然是floort(n/2).设这两数是a * gcd, b * gcd然后gcd(a,b) = 1,那么gcd要尽量大,不 ...

  2. 不同编程语言实现HelloWorld程序

    目录 C C# C++ HTML Java Python C #include <stdio.h> int main() { printf("Hello World!" ...

  3. GDI+ 双缓冲实现

    早前曾为此问题在CSDN发帖求助(GDI+ 如何使用双缓冲绘制图像),得到了一个GDI+下较可行的方法,虽然绘制效果比直接绘制要好一些,不过还不能跟GDI的双缓冲方式比肩.   现在,我终于找到了一个 ...

  4. Spring Boot是什么?

    背景 最近因公司需要,开始研究java相关的开发,之前一直从事.net相关开发,所以写的或者理解的不对的地方呢,希望大家批评指正. 首先开发框架吧,就像.net很早之前有asp.net webForm ...

  5. 【树形dp】 bzoj1131 Sta

    题目 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output 输出你所找到的点 ...

  6. 看源码,重新审视Spring Security中的角色(roles)是怎么回事

    在网上看见不少的博客.技术文章,发现大家对于Spring Security中的角色(roles)存在较大的误解,最大的误解就是没有搞清楚其中角色和权限的差别(好多人在学习Spring Security ...

  7. vim中设置tab的长度

  8. 曹工说面试:当应用依赖jar包的A版本,中间件jar包依赖B版本,两个版本不兼容,这还怎么玩?

    背景 大一点的公司,可能有一些组,专门做中间件的:假设,某中间件小组,给你提供了一个jar包,你需要集成到你的应用里.假设,它依赖了一个日期类,版本是v1:我们应用也依赖了同名的一个日期类,版本是v2 ...

  9. 「JLOI2015」城池攻占 可并堆

    传送门 分析 如果直接暴力枚举的话肯定会超时 我们可以从下往上遍历,维护一个小根堆 每次到达一个节点把战败的骑士扔出去 剩下的再继续向上合并,注意要维护一下其实的战斗力 可以像线段树那样用一个lazy ...

  10. day79 组件化开发

    目录 一.组件[component] 默认组件 二. Vue自动化工具(Vue-cli) 1 安装node.js 2 npm 3 安装Vue-cli 4 使用Vue-CLI初始化创建前端项目 4.1 ...