Python信号量threading.Semaphore

信号量主要用在保护有限的资源。
以数据库连接数为例说明,假设当前数据库支持最大连接数为3, 将信号量初始值设为3,那么同时最大可能有三个线程连接数据库,其他线程若再想连接数据库,则只有等待,直到某一个线程释放数据库连接

#!usr/bin/python
# -*- coding:utf8 -*-
import time
import threading

sm = threading.Semaphore(3)

def connectDb():
    test = sm.acquire()

    print(threading.currentThread().getName() + ' connecting to db...\n', test)
    time.sleep(2)
    print(threading.currentThread().getName() + ' released db...\n')

    sm.release()

def main():
    threads = []
    for i in range(20):
        t = threading.Thread(target=connectDb)
        threads.append(t)
    for t in threads:
        t.start()

if __name__ == '__main__':
    start = time.clock()
    main()
    end = time.clock()
    print(end - start)
result:
Thread-1 connecting to db...
 True
Thread-2 connecting to db...
 True
Thread-3 connecting to db...
 True
0.0165987
Thread-3 released db...

Thread-1 released db...

Thread-4 connecting to db...
Thread-5 connecting to db...
 True
Thread-2 released db...
 True

Thread-6 connecting to db...
 True
Thread-4 released db...
Thread-5 released db...

Thread-6 released db...

Thread-7 connecting to db...

Thread-8 connecting to db...
 True
 True
Thread-9 connecting to db...
 True
Thread-8 released db...

Thread-10 connecting to db...
 True
Thread-7 released db...

Thread-11 connecting to db...
 True
Thread-9 released db...

Thread-12 connecting to db...
 True
Thread-10 released db...

Thread-13 connecting to db...
 True
Thread-11 released db...

Thread-14 connecting to db...
 True
Thread-12 released db...

Thread-15 connecting to db...
 True
Thread-13 released db...

Thread-16 connecting to db...
 True
Thread-15 released db...
Thread-14 released db...

Thread-17 connecting to db...

 True
Thread-18 connecting to db...
 True
Thread-16 released db...

Thread-19 connecting to db...
 True
Thread-17 released db...
Thread-18 released db...


Thread-20 connecting to db...
 True
Thread-19 released db...

Thread-20 released db...

你可能感兴趣的:(Python多线程)