網站首頁 編程語言 正文
簡單總結就是:動態的release,保證任意時刻都有固定數量可用的信號量。
我們通常會這樣使用信號量
xuewei_semaphore = threading.Semaphore(4) #申請信號量 #在某個地方使用信號量 xuewei_semaphore.acquire() //do something here .... xuewei_semaphore.release()
限流的過程其實就是不斷的使用這個有限信號量的過程。
因為設置了4信號額度,最多允許4個線程同時運行。
任意時間只要獲取超過4個后,其他線程只能等待,這就跟我們進站排隊很像。安檢人員看到進入排隊的人太多的,把后面的攔住,知道等候的人數減少,再放行一些人員進入車站等候區。
直接上代碼吧,后面再解釋。
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/11/27 10:43 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷學委 # @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個線程,不停的去獲取信號量,然后做完就釋放。
同時我們有一個緩沖隊列,只存放當前新進站的人數。
通過打印這個waiting_for_train的狀態,我們可以看到任意時刻隊列最多只有4人進入。
也不會超過4個。
運行效果
在運行過程,我們發現queue的大小一直為4.
最后所有進站人員都進站上車了,等候的人就清零了。
這里總共有102個線程,一個主線程,一個等候區狀態展示線程,還有另外一個百個線程,代表了100個進站人員。
semaphore初始化了4個度量,所以每次最多可以進站等候的人數最多只有4個。
跟地鐵攔截進站一樣。
我們也可以嘗試把進站處理的代碼修改為下方代碼,讀者自行運行看一下效果。
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()
總結
好,這個限流器非常簡單,配套在這個中級編程簡單帶過一下。
讀者朋友們可以把代碼拷貝,運行幾次,思考一下。
原文鏈接:https://blog.csdn.net/geeklevin/article/details/122724982
相關推薦
- 2021-12-03 找不到或無法加載主類 CMD || 找不到\*\*\路徑|| 原因大全
- 2022-05-26 Python?if?else條件語句形式詳解_python
- 2022-04-22 C#基于WinForm實現串口通訊_C#教程
- 2023-01-21 python中封裝token問題_python
- 2022-11-06 Python解決多進程間訪問效率低的方法總結_python
- 2022-10-22 Golang?中反射的應用實例詳解_Golang
- 2022-05-11 使用kettle的數據庫增量備份與全量備份
- 2022-08-18 Python如何獲取實時股票信息的方法示例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支