Python實(shí)現(xiàn)簡易的限流器介紹
簡單總結(jié)就是:動態(tài)的release,保證任意時刻都有固定數(shù)量可用的信號量。
我們通常會這樣使用信號量
xuewei_semaphore = threading.Semaphore(4) #申請信號量 #在某個地方使用信號量 xuewei_semaphore.acquire() //do something here .... xuewei_semaphore.release()
限流的過程其實(shí)就是不斷的使用這個有限信號量的過程。
因?yàn)樵O(shè)置了4信號額度,最多允許4個線程同時運(yùn)行。
任意時間只要獲取超過4個后,其他線程只能等待,這就跟我們進(jìn)站排隊(duì)很像。安檢人員看到進(jìn)入排隊(duì)的人太多的,把后面的攔住,知道等候的人數(shù)減少,再放行一些人員進(jìn)入車站等候區(qū)。
直接上代碼吧,后面再解釋。
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/11/27 10:43 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷學(xué)委 # @XueWeiTag: CodingDemo # @File : threading_semephore.py # @Project : hello import threading import time import queue xuewei_semaphore = threading.Semaphore(4) print("xuewei_semaphore:", xuewei_semaphore) waiting_for_train = {"value": 0} def run(): new_joiner = threading.current_thread().name # print(" %s ready" %new_joiner ) xuewei_semaphore.acquire() print(" %s go" % new_joiner) waiting_for_train['value'] += 1 time.sleep(1) print(" %s completed" % threading.current_thread().name) xuewei_semaphore.release() waiting_for_train['value'] -= 1 def log_the_waiting_area_status(): while True: time.sleep(0.5) name = threading.current_thread().name print("name %s - size %s " % (name, waiting_for_train['value'])) q_watcher = threading.Thread(name="waiting area", target=log_the_waiting_area_status) q_watcher.start() threads = [] for i in range(100): t_name = "t-" + str(i) t = threading.Thread(name=t_name, target=run) threads.append(t) t.start() for t in threads: t.join()
這里我們申請了信號量4個空槽。
然后啟動100個線程,不停的去獲取信號量,然后做完就釋放。
同時我們有一個緩沖隊(duì)列,只存放當(dāng)前新進(jìn)站的人數(shù)。
通過打印這個waiting_for_train的狀態(tài),我們可以看到任意時刻隊(duì)列最多只有4人進(jìn)入。
也不會超過4個。
運(yùn)行效果
在運(yùn)行過程,我們發(fā)現(xiàn)queue的大小一直為4.
最后所有進(jìn)站人員都進(jìn)站上車了,等候的人就清零了。
這里總共有102個線程,一個主線程,一個等候區(qū)狀態(tài)展示線程,還有另外一個百個線程,代表了100個進(jìn)站人員。
semaphore初始化了4個度量,所以每次最多可以進(jìn)站等候的人數(shù)最多只有4個。
跟地鐵攔截進(jìn)站一樣。
我們也可以嘗試把進(jìn)站處理的代碼修改為下方代碼,讀者自行運(yùn)行看一下效果。
xuewei_semaphore.acquire() print(" %s go" % new_joiner) waiting_for_train['value'] += 1 time.sleep(1) waiting_for_train['value'] -= 1 print(" %s completed" % threading.current_thread().name) xuewei_semaphore.release()
總結(jié)
好,這個限流器非常簡單,配套在這個中級編程簡單帶過一下。
讀者朋友們可以把代碼拷貝,運(yùn)行幾次,思考一下。
到此這篇關(guān)于Python實(shí)現(xiàn)簡易的限流器介紹的文章就介紹到這了,更多相關(guān)Python限流器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python檢查判斷一個數(shù)是不是另一個數(shù)的整數(shù)次冪實(shí)例深究
在數(shù)學(xué)和計(jì)算中,確定一個數(shù)是否為另一個數(shù)的整數(shù)次冪是一個常見而重要的問題,例如,我們可能需要判斷一個數(shù)是否是某個數(shù)的平方、立方或其他冪次,本文將探討在Python中如何實(shí)現(xiàn)這一功能,通過數(shù)學(xué)方法和算法檢查一個數(shù)是否是另一個數(shù)的整數(shù)次冪2023-12-12Python數(shù)據(jù)可視化實(shí)現(xiàn)多種圖例代碼詳解
這篇文章主要介紹了Python數(shù)據(jù)可視化實(shí)現(xiàn)多種圖例代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07Python Pandas數(shù)據(jù)結(jié)構(gòu)簡單介紹
這篇文章主要介紹了Python Pandas數(shù)據(jù)結(jié)構(gòu)簡單介紹的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07使用Python+Splinter自動刷新?lián)?2306火車票
一年一度的春運(yùn)又來了,今年我自己寫了個搶票腳本。下面小編給大家分享使用Python+Splinter自動刷新?lián)?2306火車票,需要的朋友參考下吧2018-01-01python實(shí)現(xiàn)五子棋人機(jī)對戰(zhàn)游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)五子棋之人機(jī)對戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-065分鐘快速掌握Python定時任務(wù)框架的實(shí)現(xiàn)
這篇文章主要介紹了5分鐘快速掌握 Python 定時任務(wù)框架,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01pytorch fine-tune 預(yù)訓(xùn)練的模型操作
這篇文章主要介紹了pytorch fine-tune 預(yù)訓(xùn)練的模型操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06