互斥锁 同时只允许一个线程更改数据,而Semaphore是同时(无序轮流)允许一定数量(设置参数)的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。
import threading, time, sys def run(n): semaphore.acquire() time.sleep(1) sys.stdout.write(f"run the thread: {n}\n") #为解决print方法的线程不安全性(主要是输出换行的问题),此处使用sys.stdout.write方法替代 semaphore.release() if __name__ == '__main__': num = 0 semaphore = threading.BoundedSemaphore(5) # 最多允许5个线程同时运行 for i in range(20): t = threading.Thread(target=run, args=(i,)) t.start() while threading.active_count() != 1: #等于1时,表示只剩主线程 pass else: print('----all threads done---') print(num)