0
点赞
收藏
分享

微信扫一扫

python4-信号量和事件

穿裙子的程序员 2022-01-09 阅读 58
python

参考资料😊

菜鸟教程
视频

认识信号量

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

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

信号量的语法

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() # 开启线程
举报

相关推荐

0 条评论