原因:主要用在保护有限的资源。 假设当前数据库支持最大连接数为3,将信号量初始值设为3,那么同时最大可以有三个线程连接数据库,其他线程若再想连接数据库,则只有等待,直到某一个线程释放数据库连接。
注意:输出结果是每两秒打印的,跟数据库连接操作差的远呢
import logging import threading import time import random from threading import Semaphore logging.basicConfig( level=logging.INFO, format="%(asctime)s [*] %(message)s" ) threads = [] lock_sm = Semaphore(3) class connectdb(threading.Thread): def run (self): while True: lock_sm.acquire() logging.info(f"{self.name} connecting to db... ") logging.info(f"{self.name} released db...") time.sleep(2) lock_sm.release() if __name__ == '__main__': for i in range(5): threads.append(connectdb()) # 从五个线程取出三个 random_threads = random.sample(threads, 3) # 阻塞启动线程--------------------------- for t in random_threads: t.start() for t in random_threads: t.join()输出:
2019-10-02 17:31:38,851 [*] Thread-2 connecting to db... 2019-10-02 17:31:38,851 [*] Thread-2 released db... 2019-10-02 17:31:38,851 [*] Thread-4 connecting to db... 2019-10-02 17:31:38,851 [*] Thread-4 released db... 2019-10-02 17:31:38,851 [*] Thread-3 connecting to db... 2019-10-02 17:31:38,851 [*] Thread-3 released db... 2019-10-02 17:31:40,851 [*] Thread-2 connecting to db... 2019-10-02 17:31:40,851 [*] Thread-2 released db... 2019-10-02 17:31:40,852 [*] Thread-3 connecting to db... 2019-10-02 17:31:40,852 [*] Thread-3 released db... 2019-10-02 17:31:40,852 [*] Thread-4 connecting to db... 2019-10-02 17:31:40,854 [*] Thread-4 released db... 2019-10-02 17:31:42,853 [*] Thread-2 connecting to db... 2019-10-02 17:31:42,853 [*] Thread-2 released db... 2019-10-02 17:31:42,854 [*] Thread-3 connecting to db... 2019-10-02 17:31:42,854 [*] Thread-3 released db... 2019-10-02 17:31:42,855 [*] Thread-4 connecting to db... 2019-10-02 17:31:42,855 [*] Thread-4 released db... 2019-10-02 17:31:44,854 [*] Thread-2 connecting to db... 2019-10-02 17:31:44,854 [*] Thread-2 released db... 2019-10-02 17:31:44,855 [*] Thread-3 connecting to db... 2019-10-02 17:31:44,855 [*] Thread-3 released db... 2019-10-02 17:31:44,856 [*] Thread-4 connecting to db... 2019-10-02 17:31:44,856 [*] Thread-4 released db...