我们想要进行检票的时候,想要加快速度拓展多个检票口是不错的选择。但是多个窗口就需要配备多个检票员。而我们的多线程也是这样的道理,虽然有多个程序可以处理,但是我们需要分配出出理这些程序的人手,而Semaphore就可以很好地做到让这些线程同时运转进行,接下来我们看看如何做吧。
互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。
import threading import time def run(n, semaphore): semaphore.acquire() #加锁 time.sleep(1) print("run the thread:%s\n" % n) semaphore.release() #释放 if __name__ == '__main__': num = 0 semaphore = threading.BoundedSemaphore(5) # 最多允许5个线程同时运行 for i in range(22): t = threading.Thread(target=run, args=("t-%s" % i, semaphore)) t.start() while threading.active_count() != 1: pass # print threading.active_count() else: print('-----all threads done-----')
拓展互斥锁:
由于线程之间是进行随机调度,如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果的不可预期,我们也称此为“线程不安全”。
通过Semaphore和互斥锁定义的比较,我们很容易看出,互斥锁是一对一,而Semaphore是可以实现一对一的,大家可以根据使用情况进行选择。
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试