python4-信号量和事件

python4-信号量和事件,第1张

python4-信号量和事件 参考资料

菜鸟教程
视频

认识信号量

信号量是由 *** 作系统管理的一种抽象数据类型,用于在多线程中同步对共享资源的使用。本质上说,信号量是一个内部数据,用于标明当前的共享资源可以有多少并发读取。

也可以简单的理解为,信号量是多把锁,同时允许多个线程来更改数据,而 互斥锁 同时只允许一个 线程 更改数据。

信号量的语法
import threading
sem = threading.Semaphore(3)
sem.acquire()
sem.release()

事件event中有一个全局内置标志Flag,值为 True 或者False。使用wait()函数的线程会处于阻塞状态,此时Flag指为False,直到有其他线程调用set()函数让全局标志Flag置为True,其阻塞的线程立刻恢复运行,还可以用isSet()函数检查当前的Flag状态。

均在下面的作业题中有体现

事件

Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么event.wait 方法时便不再阻塞。

Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态。

set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。

clear(): 将标志设为False。

wait(timeout): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。

isSet(): 获取内置标志状态,返回True或False。

作业题

自己的答案:

import threading
import time

def exam1():
  while (semaphore.acquire()):
    if event.is_set(): # 设置事件
      print('考试中') # 事件设置时,打印 考试中
      # event.wait(1)
    else: 
      print('考试结束') # 如果事件结束打印事件已经结束
      event.wait(1) # 延迟输出
    semaphore.release() # 释放锁
      

def set_event():
  # while True:
  print('获取当前时间为:'+time.ctime(time.time())) # 获取当前时间
  event.set() # 设置时间
  time.sleep(3) # 三秒钟之后
  print()
  print('三秒后,释放锁,触发事件')
  event.clear() # 清楚事件
  

if __name__=='__main__':
  semaphore=threading.Semaphore(1) # 设置并发线程数
  event=threading.Event() # 绑定事件
  
  set_e=threading.Thread(target=set_event)
  set_e.start() # 开启线程
  exam1=threading.Thread(target=exam1)
  exam1.start() # 开启线程

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zaji/5700727.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存