11.python并发入门(part6 Semaphore信号量)

1、什么是信号量。
python

信号量也是一种锁。并发

信号量的主要用途是用来控制线程的并发量的,BoundedSemaphore或Semaphore管理一个内置的计数器,每调用一次acquire()方法时,计数器-1,每调用一次release()方法时,内部计数器+1。python2.7

不过须要注意的是,Semaphore内部的计数器不能小于0!当它内部的计数器等于0的时候,这个线程会被锁定,进入阻塞状态,直到其余线程去调用release方法。ide

BoundedSemaphore与Semaphore的惟一区别在于前者将在调用release()时检查计数 器的值是否超过了计数器的初始值,若是超过了将抛出一个异常。ui


2、信号量使用的示例。线程

#!/usr/local/bin/python2.7递归

# -*- coding:utf-8 -*-utf-8

import threadingget

import timeit

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个线程,这个和停车位的概念有点像。


3、信号量与递归锁的区别。

我的理解~信号量和递归锁的差异是否是,在信号量中,同一把锁,多个线程能够操做同一个共享数据,在递归锁在锁被释放以前一个线程只能操做一个共享数据。

相关文章
相关标签/搜索