網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
簡(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è)線程同時(shí)運(yùn)行。
任意時(shí)間只要獲取超過(guò)4個(gè)后,其他線程只能等待,這就跟我們進(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è)線程,不停的去獲取信號(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è)線程,一個(gè)主線程,一個(gè)等候區(qū)狀態(tài)展示線程,還有另外一個(gè)百個(gè)線程,代表了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)行幾次,思考一下。
原文鏈接:https://blog.csdn.net/geeklevin/article/details/122724982
相關(guān)推薦
- 2022-10-02 C++?OpenCV實(shí)戰(zhàn)之手寫(xiě)數(shù)字識(shí)別_C 語(yǔ)言
- 2022-08-24 .net新興日志框架Serilog簡(jiǎn)介_(kāi)實(shí)用技巧
- 2022-07-30 react中受控組件與非受控組件
- 2022-09-22 python 參數(shù)內(nèi)存地址相關(guān)
- 2023-03-30 官網(wǎng)項(xiàng)目Jetpack?Startup庫(kù)學(xué)習(xí)_Android
- 2023-04-26 React使用PropTypes實(shí)現(xiàn)類型檢查功能_React
- 2022-08-02 Python+Selenium實(shí)現(xiàn)瀏覽器標(biāo)簽頁(yè)的切換_python
- 2022-02-10 linux后臺(tái)運(yùn)行任務(wù)命令(nohup: 忽略輸入并把輸出追加到“nohup.out“)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支