Python深度培训笔记四
2022/1/10 11:03:48
本文主要是介绍Python深度培训笔记四,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
一、信号量
1.什么是信号量?
2.怎么实现?
二、条件变量
1.什么是条件变量?
2.怎么实现?
三、事件
1.什么是事件?
2.怎么实现?
一、信号量
1.什么是信号量?
信号量是由操作系统管理的一种抽象数据类型,用于在多线程中同步对共享资源的使用。本质上说,信号量是一个内部数据,用于标明当前的共享资源可以有多少并发读取。
2.怎么实现?
threading模块里的Semaphore类,实现了信号量对象,可用于控制获取资源的线程数量。所具有的acquire()和release()方法,可以用with语句的上下文管理器。当进入时,将调用acquire()方法,当退出时,将调用release()。
#信号量 import threading import time def run(n,x): semaphore.acquire() print(n) time.sleep(x) semaphore.release() if __name__ == '__main__': semaphore = threading.Semaphore(5)#同时执行5个线程 for i in range(16): t = threading.Thread(target=run,args=(i,i)) t.start()
二、条件变量
1.什么是条件变量?
Python 提供的 Condition 对象提供了对复杂线程同步问题的支持。 Condition 被称为条件变量,除了提供与 Lock 类似的 acquire 和 release 方法外,还提供了 wait 和 notify 方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。
2.怎么实现?
线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。
#条件变量 import threading import time def run(x): # lock.acquire() con.acquire() print(f'线程{x}') con.notify() print(f'线程{x}挂起') con.wait() time.sleep(1) print(f'线程{x}再次启动') con.notify() con.release() # lock.release() def run2(x): con.acquire() print(f'线程{x}') con.notify() print(f'线程{x}挂起') con.wait() time.sleep(1) print(f'线程{x}再次启动') con.notify() con.release() if __name__ == '__main__': lock=threading.RLock() con=threading.Condition() # for i in range(10): # t = threading.Thread(target=run,args=(i,)) # t.start() t1=threading.Thread(target=run,args=(1,)) t1.start() t1=threading.Thread(target=run,args=(1,)) t1.start()
三、事件
1.什么是事件?
Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态。
事件的工作机制:在初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行。
2.怎么实现?
set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。
clear(): 将标志设为False。
wait(timeout): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。
isSet(): 获取内置标志状态,返回True或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() time.sleep(1) if __name__ == '__main__': event = threading.Event() car1 = threading.Thread(target=car) car1.start() set_e = threading.Thread(target=set_event()) set_e.start()
这篇关于Python深度培训笔记四的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01Python编程基础知识
- 2024-11-01Python编程基础
- 2024-10-31Python基础入门:理解变量与数据类型
- 2024-10-30Python股票自动化交易资料详解与实战指南
- 2024-10-30Python入行:新手必读的Python编程入门指南
- 2024-10-30Python入行:初学者必备的编程指南
- 2024-10-30Python编程入门指南
- 2024-10-30Python量化交易学习:新手入门指南
- 2024-10-30Python股票自动化交易实战入门教程
- 2024-10-29Python股票自动化交易教程:新手入门指南