Python--信号量、条件变量、事件

信号量

信号量用来控制线程并发数的,Semaphore管理一个内置的计数 器,每当调用acquire()时-1,调用release()时+1。计数器不能小于0,当计数器为 0时,acquire()将阻塞线程至同步锁定状态,直到其他线程调用release()。其实就是控制最多几个线程可以操作同享资源。

import threading, time


class my_thread(threading.Thread):
    def run(self):
        if semaphore.acquire():  # 加锁
            print(self.name)
            time.sleep(1)
            semaphore.release()  # 解锁


if __name__ == "__main__":
    semaphore - threading.Semaphore(5)  # 创建锁对象,二者都可以
    thrs = []
    for i in range(100):
        thrs.append(my_thread())
    for t in thrs:
        t.start()

上面一个简单的例子就是创建100个线程,让每次只让5个线程去执行run函数。

用一个图形象的解释就是

条件变量

条件变量的同步

有一类线程需要满足条件之后才能够执行,Python提供了threading.Condition 对象用于条件变量线程的支持,它除了能提供RLock()或Lock() 方法外,还提供了wait()、notify()、notifyAll()方法。

wait():条件不满足时调用,线程会释放锁并进入等待阻塞。
notify():条件创建后调用,通知等待池激活另一个线程。
notifyAll():条件创造后调用,通知等待池激活所有线程。

事件

同进程一样

线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行。

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

 

import threading
import time


def car():
    while True:
        if event.is_set():
            print("小车启动")
        else:
            print("小车停止")
            event.wait()


def set_event():
    while True:
        event.set()
        time.sleep(1)
        event.clear()
        ime.sleep(1)


if __name__ == "__main__":
    event = threading.Event()
    car1 = threading.Thread(target=car)
    car1.start()
    set_ = threading.Thread(target=set_event)
    set_.start()

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值