Python高级培训Day4

目录

信号量

条件变量

事件


信号量

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

用于控制线程并发数

import threading
class Mythread(threading.Thread):
    def run(self):
        if seamphore.acquire():#加锁
            print(self.name)
            time.sleep(1)
            seamphore.realease()#释放
            
if __name__ == "__main__":
    semaphore = threading.Semaphore(5)#创建锁对象
    thrs=[]
    for i in range(100):
        thrs.append(Mythread())
    for j in thrs:
        j=start()

条件变量

Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。

可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。

使用条件变量
(1)创建Condition对象,使用acquire调用Condition对象
(2)调用wait方法时,释放Condition,进入等待状态,同时在waiting池中记录这个线程。
(3)调用notify方法时,Condition对象调用acquire方法尝试取到锁。

事件

创建事件

import threading
import time

def car():
    while True:
        if event.is_set():#如果事件已创建
            print('小车行驶')
        else:
            print('小车停止')
            event.wait(1)

def set_event():#创建事件
    while True:
        event.set()
        time.sleep(1)
        event.clear()
        time.sleep(3)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值