进击の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

*****
*****

最新文章

  1. 最新的 cocoaPods 安装方法
  2. sqlserver 插入数据时异常,仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'XXXXX.dbo.XXXXXXXXX'中的标识列指定显式值。
  3. android 自定义scrollview 仿QQ空间效果 下拉伸缩顶部图片,上拉回弹 上拉滚动顶部title 颜色渐变
  4. Gvr SDK for Unity 分析(一)
  5. jQuery中添加/改变/移除改变CSS样式例子
  6. css各兼容应该注意的问题
  7. 转:eclipse怎样修改包(package)的显示样式、格式 工具/原料
  8. 路径和 二叉树 leecode
  9. 329. Longest Increasing Path in a Matrix
  10. Javascript学习6 - 类、对象、继承
  11. 转 使用SQL从AWR收集数据库性能变化趋势
  12. Python学习笔记_02:使用Tkinter连接MySQL数据库实现登陆注册功能
  13. 玩转Web之SSH--Heibernate (一)---第一个demo
  14. vue 源代码创建tabs
  15. 手机端两端对齐,兼容ios,安卓
  16. Ecstore 默认图片压缩质量差的问题解决方法
  17. OLE、OCX和ActiveX控件之间的比较
  18. JAXBContext处理CDATA
  19. CentOS重置Mysql密码
  20. cocos2dx-环境搭建和创建项目(mac用)

热门文章

  1. web安全之跨站脚本漏洞(XSS)
  2. centos 7 增加永久静态路由
  3. Python实用笔记 (8)高级特性——迭代
  4. em(倍)与px的区别
  5. hive sql 解析json
  6. sorted 函数及小练习
  7. idea 启动官网spring boot demo 报错
  8. day01微信小程序
  9. web网页多语言的实现方案_前端实现多语言切换
  10. html通过css,js实现div悬浮效果总汇,如原生JS实现滚动到一定位置实现div悬浮