信号量:
多线程同时运行,能提高程序的运行效率,但是并非线程越多越好,而 semaphore 信号量可以通过内置计数器来控制同时运行线程的数量,启动线程(消耗信号量)内置计数器会自动减一,线程结束(释放信号量)内置计数器会自动加一;内置计数器为零,启动线程会阻塞,直到有本线程结束或者其他线程结束为止;
semaphore = threading.Semaphore(5)#实例化一个信号量,最多同时运行5个线程
括号里边传参可以控制同时执行几个,特点:共同执行的五个线程中,一旦有线程结束,不够五个时,马上从后边补成5个。在所需函数内容上下加锁, semaphore.acquire() 计数器获得锁, semaphore.release() 计数器释放锁。之后在主函数中创建多线程并启动,每一个线程就像一辆汽车,信号量的个数是停车位的个数,它限制着汽车进出,如果停车位满了,那么汽车不允许进入。
条件变量:
如果使用多线程,即很多个线程同时运行,使用线程锁可以控制一个线程运行完再运行下一个,而条件变量的作用是可以在上一个线程运行到一半时运行下一个,依次有秩序进行下去。条件变量对象允许多条线程保持等待状态直到接收另一条线程的通知。
con = threading.Condition
同样用con.acquire() release() ,condition里有wait。con.notify和con.wait 上下连用,当第二个线程运行到notify,此时第一个线程在wait 上等待,notify的作用就是告诉第一个线程停止等待继续进行
事件
一个线程标识一个事件,其他线程一直处于等待状态。
若创建了两个子线程,可以通过主线程的event对象来控制子线程什么时候开始执行(使用event.wait()方法阻塞子线程)。
event =threading.Event
event.set()#设置事件
event.clear()#取消事件
#监测事件
#如果这个事件被设置了
if event.is_set():
print("jj")
else:
event.wait()#如果没有设置,这个事件就等着