11.python并发入门(part6 Semaphore信号量)
2017-05-14 12:45
274 查看
一、什么是信号量。
信号量也是一种锁。
信号量的主要用途是用来控制线程的并发量的,BoundedSemaphore或Semaphore管理一个内置的计数器,每调用一次acquire()方法时,计数器-1,每调用一次release()方法时,内部计数器+1。
不过需要注意的是,Semaphore内部的计数器不能小于0!当它内部的计数器等于0的时候,这个线程会被锁定,进入阻塞状态,直到其他线程去调用release方法。
BoundedSemaphore与Semaphore的唯一区别在于前者将在调用release()时检查计数 器的值是否超过了计数器的初始值,如果超过了将抛出一个异常。
二、信号量使用的示例。
#!/usr/local/bin/python2.7
# -*- coding:utf-8 -*-
import threading
import time
semaphore = threading.Semaphore(5) #设置同一次只能最多有5个线程通过。
def func():
if semaphore.acquire():
print threading.currentThread().getName() + "semaphore"
time.sleep(2)
semaphore.release()
for _ in range(20):
t1 = threading.Thread(target=func)
t1.start()
输出运行结果:
Thread-1semaphore
Thread-2semaphore
Thread-3semaphore
Thread-4semaphore
Thread-5semaphore
Thread-6semaphore
Thread-7semaphore
Thread-8semaphore
Thread-9semaphore
Thread-10semaphore
Thread-13semaphore
Thread-11semaphore
Thread-12semaphore
Thread-14semaphore
Thread-15semaphore
Thread-17semaphore
Thread-20semaphore
Thread-19semaphore
Thread-18semaphore
Thread-16semaphore
一次最多放行了5个线程,这个和停车位的概念有点像。
三、信号量与递归锁的区别。
个人理解~信号量和递归锁的差别是不是,在信号量中,同一把锁,多个线程可以操作同一个共享数据,在递归锁在锁被释放之前一个线程只能操作一个共享数据。
信号量也是一种锁。
信号量的主要用途是用来控制线程的并发量的,BoundedSemaphore或Semaphore管理一个内置的计数器,每调用一次acquire()方法时,计数器-1,每调用一次release()方法时,内部计数器+1。
不过需要注意的是,Semaphore内部的计数器不能小于0!当它内部的计数器等于0的时候,这个线程会被锁定,进入阻塞状态,直到其他线程去调用release方法。
BoundedSemaphore与Semaphore的唯一区别在于前者将在调用release()时检查计数 器的值是否超过了计数器的初始值,如果超过了将抛出一个异常。
二、信号量使用的示例。
#!/usr/local/bin/python2.7
# -*- coding:utf-8 -*-
import threading
import time
semaphore = threading.Semaphore(5) #设置同一次只能最多有5个线程通过。
def func():
if semaphore.acquire():
print threading.currentThread().getName() + "semaphore"
time.sleep(2)
semaphore.release()
for _ in range(20):
t1 = threading.Thread(target=func)
t1.start()
输出运行结果:
Thread-1semaphore
Thread-2semaphore
Thread-3semaphore
Thread-4semaphore
Thread-5semaphore
Thread-6semaphore
Thread-7semaphore
Thread-8semaphore
Thread-9semaphore
Thread-10semaphore
Thread-13semaphore
Thread-11semaphore
Thread-12semaphore
Thread-14semaphore
Thread-15semaphore
Thread-17semaphore
Thread-20semaphore
Thread-19semaphore
Thread-18semaphore
Thread-16semaphore
一次最多放行了5个线程,这个和停车位的概念有点像。
三、信号量与递归锁的区别。
个人理解~信号量和递归锁的差别是不是,在信号量中,同一把锁,多个线程可以操作同一个共享数据,在递归锁在锁被释放之前一个线程只能操作一个共享数据。
相关文章推荐
- 11.python并发入门(part4 死锁与递归锁)
- 11.python并发入门(part12 初识协程)
- 并发编程:信号量入门---转
- JDK 5.0 Concurrency Utilities 并发处理(4)Semaphore 信号量
- 【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)
- 信号量(Semaphore),实现方法的并发限量使用
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(2)
- 信号量(semaphore)入门
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(6)
- GCD 信号量控制并发 (dispatch_semaphore)
- java并发编程学习:用 Semaphore (信号量)控制并发资源
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(4)
- 信号量(semaphore)入门
- GCD 信号量控制并发 (dispatch_semaphore)
- 并发中的信号量Semaphore
- 【Java并发编程】:并发新特性—信号量Semaphore(含代码)
- 信号量(semaphore)入门
- 【Java并发编程】并发新特性—信号量Semaphore(含代码)
- Java并发学习笔记(15)信号量(Semaphore) 关卡((2)CyclicBarrier)
- GCD 信号量控制并发 (dispatch_semaphore)