信号量:
信号量是由 *** 作系统管理的一种抽象数据类型,用于在多线程中同步对共享资源的使用。本质上说,信号量是一个内部数据,用于标明当前的共享资源可以有多少并发读取。
threading模块里的Semaphore类实现了信号量对象,可用于控制获取资源的线程数量。所具有的acquire()和release()方法,可以用with语句的上下文管理器。当进入时,将调用acquire()方法,当退出时,将调用release()。
作用及应用:
主要用在数据库应用中,比如连接数据库的连接,限制同时连接的数量,如数据库连接池。
Semaphore模板:
import threading,time def run(n): # 获取一坨信号量 semaphore.acquire() time.sleep(1) print("run the thread: %sn" %n) # 释放信号量 semaphore.release() if __name__ == '__main__': # 声明信号量实例 # 最多允许5个线程同时运行 semaphore = threading.BoundedSemaphore(5) for i in range(20): t = threading.Thread(target=run,args=(i,)) t.start() # 1个线程以上就成立 while threading.active_count() != 1: pass else: print('----all threads done---')
条件变量:
Python 提供的 Condition 对象提供了对复杂线程同步问题的支持。 Condition 被称为条件变量,除了提供与 Lock 类似的 acquire 和 release 方法外,还提供了 wait 和 notify 方法。
构造方法:
import threading # 可传入一个互斥锁或者可重入锁 cond = threading.Condition()
事件:
Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么event.wait 方法时便不再阻塞。
Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态。
Event()
set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。
clear(): 将标志设为False。
wait(timeout): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。
isSet(): 获取内置标志状态,返回True或False。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)