python執行緒訊號量semaphore使用解析
阿新 • • 發佈:2020-01-09
這篇文章主要介紹了python執行緒訊號量semaphore使用解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
一.semaphore訊號量原理
多執行緒同時執行,能提高程式的執行效率,但是並非執行緒越多越好,而semaphore訊號量可以通過內建計數器來控制同時執行執行緒的數量,啟動執行緒(消耗訊號量)內建計數器會自動減一,執行緒結束(釋放訊號量)內建計數器會自動加一;內建計數器為零,啟動執行緒會阻塞,直到有本執行緒結束或者其他執行緒結束為止;
二.semaphore訊號量相關函式介紹
acquire() — 消耗訊號量,內建計數器減一;
release() — 釋放訊號量,內建計數器加一;
在semaphore訊號量有一個內建計數器,控制執行緒的數量,acquire()會消耗訊號量,計數器會自動減一;release()會釋放訊號量,計數器會自動加一;當計數器為零時,acquire()呼叫被阻塞,直到release()釋放訊號量為止。
三.semaphore訊號量使用
建立多個執行緒,限制同一時間最多執行5個執行緒,示例程式碼如下:
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(個人部落格地址): shuopython.com @WeChat Official Account(微信公眾號):猿說python @Github:www.github.com @File:python_semaphore.py @Time:2019/10/23 21:25 @Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累! """ # 匯入執行緒模組 import threading # 匯入時間模組 import time # 新增一個計數器,最大併發執行緒數量5(最多同時執行5個執行緒) semaphore = threading.Semaphore(5) def foo(): semaphore.acquire() #計數器獲得鎖 time.sleep(2) #程式休眠2秒 print("當前時間:",time.ctime()) # 列印當前系統時間 semaphore.release() #計數器釋放鎖 if __name__ == "__main__": thread_list= list() for i in range(20): t=threading.Thread(target=foo,args=()) #建立執行緒 thread_list.append(t) t.start() #啟動執行緒 for t in thread_list: t.join() print("程式結束!")
輸出結果:
當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:21:59 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:01 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:03 2019 當前時間: Wed Oct 23 22:22:05 2019 當前時間: Wed Oct 23 22:22:05 2019 當前時間: Wed Oct 23 22:22:05 2019 當前時間: Wed Oct 23 22:22:05 2019 當前時間: Wed Oct 23 22:22:05 2019 程式結束!
根據列印的日誌可以看出,同一時間只有5個執行緒執行,間隔兩秒之後,再次啟動5個執行緒,直到20個執行緒全部執行結束為止;如果沒有設定訊號量Semapaore,建立執行緒直接start(),輸出的時間全部都是一樣的,這個問題比較簡單,可以自己去實驗一下!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。