Python實(shí)現(xiàn)簡(jiǎn)易的限流器介紹
簡(jiǎn)單總結(jié)就是:動(dòng)態(tài)的release,保證任意時(shí)刻都有固定數(shù)量可用的信號(hào)量。
我們通常會(huì)這樣使用信號(hào)量
xuewei_semaphore = threading.Semaphore(4) #申請(qǐng)信號(hào)量 #在某個(gè)地方使用信號(hào)量 xuewei_semaphore.acquire() //do something here .... xuewei_semaphore.release()
限流的過(guò)程其實(shí)就是不斷的使用這個(gè)有限信號(hào)量的過(guò)程。
因?yàn)樵O(shè)置了4信號(hào)額度,最多允許4個(gè)線(xiàn)程同時(shí)運(yùn)行。
任意時(shí)間只要獲取超過(guò)4個(gè)后,其他線(xiàn)程只能等待,這就跟我們進(jìn)站排隊(duì)很像。安檢人員看到進(jìn)入排隊(duì)的人太多的,把后面的攔住,知道等候的人數(shù)減少,再放行一些人員進(jìn)入車(chē)站等候區(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()
這里我們申請(qǐng)了信號(hào)量4個(gè)空槽。
然后啟動(dòng)100個(gè)線(xiàn)程,不停的去獲取信號(hào)量,然后做完就釋放。
同時(shí)我們有一個(gè)緩沖隊(duì)列,只存放當(dāng)前新進(jìn)站的人數(shù)。
通過(guò)打印這個(gè)waiting_for_train的狀態(tài),我們可以看到任意時(shí)刻隊(duì)列最多只有4人進(jìn)入。
也不會(huì)超過(guò)4個(gè)。
運(yùn)行效果
在運(yùn)行過(guò)程,我們發(fā)現(xiàn)queue的大小一直為4.

最后所有進(jìn)站人員都進(jìn)站上車(chē)了,等候的人就清零了。

這里總共有102個(gè)線(xiàn)程,一個(gè)主線(xiàn)程,一個(gè)等候區(qū)狀態(tài)展示線(xiàn)程,還有另外一個(gè)百個(gè)線(xiàn)程,代表了100個(gè)進(jìn)站人員。
semaphore初始化了4個(gè)度量,所以每次最多可以進(jìn)站等候的人數(shù)最多只有4個(gè)。
跟地鐵攔截進(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é)
好,這個(gè)限流器非常簡(jiǎn)單,配套在這個(gè)中級(jí)編程簡(jiǎn)單帶過(guò)一下。
讀者朋友們可以把代碼拷貝,運(yùn)行幾次,思考一下。
到此這篇關(guān)于Python實(shí)現(xiàn)簡(jiǎn)易的限流器介紹的文章就介紹到這了,更多相關(guān)Python限流器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django實(shí)現(xiàn)將后臺(tái)model對(duì)象轉(zhuǎn)換成json對(duì)象并傳遞給前端jquery
這篇文章主要介紹了django實(shí)現(xiàn)將后臺(tái)model對(duì)象轉(zhuǎn)換成json對(duì)象并傳遞給前端jquery,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Python實(shí)現(xiàn)將絕對(duì)URL替換成相對(duì)URL的方法
這篇文章主要介紹了Python實(shí)現(xiàn)將絕對(duì)URL替換成相對(duì)URL的方法,涉及Python字符串操作及正則匹配的相關(guān)技巧,需要的朋友可以參考下2015-06-06
Django數(shù)據(jù)庫(kù)操作之save與update的使用
這篇文章主要介紹了Django數(shù)據(jù)庫(kù)操作之save與update的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
matplotlib實(shí)現(xiàn)顯示偽彩色圖像及色度條
今天小編就為大家分享一篇matplotlib實(shí)現(xiàn)顯示偽彩色圖像及色度條,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python2實(shí)現(xiàn)的LED大數(shù)字顯示效果示例
這篇文章主要介紹了Python2實(shí)現(xiàn)的LED大數(shù)字顯示效果,涉及Python的簡(jiǎn)單交互與列表相關(guān)使用技巧,需要的朋友可以參考下2017-09-09
Python爬蟲(chóng)爬取Bilibili彈幕過(guò)程解析
這篇文章主要介紹了Python爬蟲(chóng)爬取Bilibili彈幕過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
python如何給內(nèi)存和cpu使用量設(shè)置限制
這篇文章主要介紹了python如何給內(nèi)存和cpu使用量設(shè)置限制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
神經(jīng)網(wǎng)絡(luò)相關(guān)之基礎(chǔ)概念的講解
今天小編就為大家分享一篇關(guān)于神經(jīng)網(wǎng)絡(luò)相關(guān)之基礎(chǔ)概念的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12

