1. 程式人生 > 程式設計 >python執行緒訊號量semaphore使用解析

python執行緒訊號量semaphore使用解析

這篇文章主要介紹了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(),輸出的時間全部都是一樣的,這個問題比較簡單,可以自己去實驗一下!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。