信号量

信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行。

如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路人争抢公共厕所,公共厕所有多个坑位,这意味着同一时间可以有多个人上公共厕所,但公共厕所容纳的人数是一定的,这便是信号量的大小。

from threading import Thread,Semaphore,current_thread
import time,randomsm = Semaphore(3)  # 设置信号量为3,即同时会有3个任务会抢到锁def task():sm.acquire()print("%s acquire task" %current_thread().getName())time.sleep(random.randint(1,3))sm.release()print("-------- %s release task \n" % current_thread().getName())if __name__ == '__main__':for i in range(10):t = Thread(target=task)t.start()------------输出------------
Thread-1 acquire task
Thread-2 acquire task
Thread-3 acquire task
-------- Thread-1 release task -------- Thread-3 release task
Thread-4 acquire task
Thread-5 acquire task-------- Thread-5 release task -------- Thread-2 release task Thread-7 acquire task
Thread-6 acquire task
-------- Thread-7 release task
Thread-8 acquire task-------- Thread-4 release task Thread-9 acquire task
-------- Thread-6 release task Thread-10 acquire task
-------- Thread-8 release task -------- Thread-9 release task -------- Thread-10 release task

 原理 

1. Semaphore管理一个内置的计数器
2. 每当调用acquire()时内置计数器-1
3. 调用release() 时内置计数器+1
4. 计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()

Event

线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。

为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。

在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。

一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行

from threading import Event
Event.isSet() #返回event的状态值
Event.wait() #如果 event.isSet()==False将阻塞线程;
Event.set() #设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
Event.clear() #恢复

 例如,有多个工作线程尝试链接MySQL,我们想要在链接前确保MySQL服务正常才让那些工作线程去连接MySQL服务器,如果连接不成功,

都会去尝试重新连接。那么我们就可以采用threading.Event机制来协调各个工作线程的连接操作

from threading import currentThread, Thread,Event
import timeevent = Event()def conn_mysql():"连接mysql"count = 1while not event.is_set():# 当没有检测到时候if count > 3:  # 如果尝试次数大于3,就主动抛异raise ConnectionError('尝试链接的次数过多')print('%s 第%s次尝试' % (currentThread(), count))event.wait(timeout=1)  # 等待检测(里面的参数是超时1秒)count += 1print('%s 开始链接...' % (currentThread().getName()))def check_mysql():''' 检测数据库'''print('%s 检测mysql...' % (currentThread().getName()))time.sleep(2)event.set()if __name__ == '__main__':for i in range(3):t = Thread(target=conn_mysql)t.start()t = Thread(target=check_mysql)t.start()----输出------
<Thread(Thread-1, started 7860)> 第1次尝试
<Thread(Thread-2, started 2816)> 第1次尝试
<Thread(Thread-3, started 8188)> 第1次尝试
Thread-4 检测mysql...
Thread-2 开始链接...
Thread-1 开始链接...
<Thread(Thread-1, started 7860)> 第2次尝试
Thread-3 开始链接...
<Thread(Thread-3, started 8188)> 第2次尝试
<Thread(Thread-2, started 2816)> 第2次尝试
Thread-1 开始链接...
Thread-3 开始链接...
Thread-2 开始链接...

  

定时器

定时器,指定n秒后执行某操作

from threading import Timerdef task(name):print('hell0 %s' % name)t = Timer(5,task,args=('egon',))
t.start()

  

验证码输入

from threading import Timer
import randomclass Code(object):def __init__(self):self.make_cache()def make_cache(self,interval=10):self.cache = self.make_code()print("验证码:", self.cache)self.t = Timer(interval, self.make_cache)  # 每过5s执行一次self.t.start()def make_code(self,n=4):res = ''for i in range(n):s1 = str(random.randint(0,9))s2 = chr(random.randint(65,90))res += random.choice([s1,s2])return resdef check_code(self):while True:code = input("请输入验证码>> ").strip()if code.upper() == self.cache:print('验证码输入正确!')self.t.cancel()break
obj = Code()
obj.check_code()

  

转载于:https://www.cnblogs.com/xiao-apple36/p/9484788.html

python 信号量,Event, 定时器相关推荐

  1. Python3 从零单排27_锁信号量Event定时器

    1.死锁 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁 ...

  2. python线程延时函数_详解Python 多线程 Timer定时器/延迟执行、Event事件

    Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征.这个类用来定义多久执行一个函数. 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cance ...

  3. 【Python高级之定时器】

    Python高级之定时器 定时器 定时器 如果需要使用定时器去触发一些事件,Python中通过线程实现定时器timer,定时器的意思也是:一段时间后调用一个函数. 用法: import threadi ...

  4. GIL+死锁与递归锁+信号量+event事件

    GIL全局解释器锁: GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程 必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线 ...

  5. Python 多进程/Event 重复使用唤醒

    原作者的意思是要把__event写到类内部,不能写一个全局变量就了事, 这次测试发现,event可以重复使用,重复被唤醒. 2019.0516测试ok #/usr/bin/env python #co ...

  6. python中实现定时器Timer

    实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...

  7. python中event的用法_Python编程之event对象的用法实例分析

    本文实例讲述了Python编程中event对象的用法.分享给大家供大家参考,具体如下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位为假,则线程等待直到信号 ...

  8. python编程(定时器)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 网络编程中,状态机和定时器对于python来说也是少不了的.然而,在twisted上编写定时器函 ...

  9. python 信号量 semaphore

    信号量 信号量(英语:semaphore)又称为信号标, 是一个同步对象,用于保持在0至指定最大值之间的一个计数值. 当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一: 当线 ...

最新文章

  1. 指尖上的电商---(4).net开发solr
  2. 智能合约重构社会契约 (5)比特犬模型实现智能合约
  3. mysql query browser的使用_影响MySQL性能的配置参数
  4. 關於BigDecimal的比較
  5. hibernate数据类型_Hibernate类型初学者指南
  6. Redis:14---常用功能之(Pipeline)
  7. 漫画:从修灯泡来看各种 IT 岗位,你是哪一种?
  8. Spark createDirectStream 维护 Kafka offset(Scala)
  9. AI学习笔记(十)卷积神经网络
  10. Win Server 8中的利器:微软在线备份服务
  11. JavaScript的DOM操作.
  12. python反编译软件下载_python批量反编译软件
  13. Win10设置系统保护色
  14. vue 后台翻译_vue实现在线翻译功能
  15. Java获取本机ip地址的代码
  16. 中国拖车洒水器市场趋势报告、技术动态创新及市场预测
  17. php的toast,toast提示是什么
  18. 二级分销商城模式开发
  19. 电脑键盘部分按键失灵的解决方法
  20. 特别实用的正则在线工具regexr

热门文章

  1. Android代码实现APK文件的安装与卸载
  2. 勇士斗恶龙:没那么复杂的Js闭包(改)
  3. Apk文件破解反编译(转)
  4. 高性能ASP.NET系统架构设计
  5. [转]最快速度找到内存泄漏
  6. ERP顾问的三层境界
  7. python执行代码加key_用Python在注册表运行键中创建新值?
  8. CCS5.2 Graph的使用方法及步骤 FFT
  9. 平台篇-58 HBase 平台实践和应用
  10. Java Socket传输数据的文件系统介绍