python線程信號量semaphore(33)

   

    經過前面對 線程互斥鎖lock /  線程事件event / 線程條件變量condition / 線程定時器timer 的講解,相信你對線程threading模塊已經有了必定的瞭解,同時執行多個線程的確能夠提升程序的效率,可是並不是線程的數量越多越好,可能對於計算機而言,你直接運行20~30線程可能沒太大影響,若是同時運行上千個甚至上萬個呢?我相信你電腦會直接癱瘓……python

 

耳朵

 

一.semaphore信號量原理

    多線程同時運行,能提升程序的運行效率,可是並不是線程越多越好,而semaphore信號量能夠經過內置計數器來控制同時運行線程的數量,啓動線程(消耗信號量)內置計數器會自動減一,線程結束(釋放信號量)內置計數器會自動加一;內置計數器爲零,啓動線程會阻塞,直到有本線程結束或者其餘線程結束爲止;git

 

喲呵

 

二.semaphore信號量相關函數介紹

    acquire() — 消耗信號量,內置計數器減一;github

    release() — 釋放信號量,內置計數器加一;微信

    在semaphore信號量有一個內置計數器,控制線程的數量,acquire()會消耗信號量,計數器會自動減一;release()會釋放信號量,計數器會自動加一;當計數器爲零時,acquire()調用被阻塞,直到release()釋放信號量爲止。多線程

python學習

 

三.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("程序結束!")

 

    輸出結果:app

當前時間: 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(),輸出的時間所有都是同樣的,這個問題比較簡單,能夠本身去實驗一下!函數

 

python學習

 

猜你喜歡:

    1.python線程的建立和參數傳遞學習

    2.python字典推導式ui

    3.python列表推導式

    4.python return邏輯運算符

    5.python 不定長參數*argc,**kargcs

 

    轉載請註明:猿說Python » python線程信號量semaphore

 

技術交流、商務合做請直接聯繫博主
掃碼或搜索:猿說python
python教程公衆號
猿說python
微信公衆號 掃一掃關注
相關文章
相關標籤/搜索