标签:网络 失败 count() 全局 必须 信号 更改 lock 问题
互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据。简单介绍如下:
信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的。
也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务 并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。而线程互斥锁则是“锁住某一资源”的概念,在锁定期间内,其他线程无法对被保护的数据进 行操作。在有些情况下两者可以互换。
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。
Mutex可以被抽象为四个操作:
互斥锁和信号量的区别:
import threading,time def run(n): semaphore.acquire() time.sleep(1) print ("run the thread:%s\n " % n) semaphore.release() if __name__ == "__main__": semaphore = threading.BoundedSemaphore(4) #最多允许4个线程同时运行 for i in range(10): t = threading.Thread(target=run,args=(i,)) t.start() while threading.active_count() != 1: pass else: print("--all thread done--") 输出: run the thread:0 run the thread:1 run the thread:2 run the thread:3 run the thread:4 run the thread:7 run the thread:5 run the thread:6 run the thread:9 run the thread:8 --all thread done-- Process finished with exit code 0
备注:每次执行4个线程,等前面执行完成后,在进行下一个。最后剩下两个,会一起执行。整个执行过程中是无序的。
12、第七周-网络编程 - 线程中的信号量(Semaphore)
标签:网络 失败 count() 全局 必须 信号 更改 lock 问题
原文地址:https://www.cnblogs.com/chen170615/p/8746546.html