原因:主要用在保護有限的資源。
假設當前數據庫支持最大連接數爲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...