0

0

Python 并发限流的实现思路

冷炫風刃

冷炫風刃

发布时间:2026-01-21 20:38:44

|

383人浏览过

|

来源于php中文网

原创

Python并发限流核心是控制任务并发数防资源过载,按场景选机制:单机用Semaphore或线程池,分布式用Redis+Lua,精细化用令牌桶算法。

python 并发限流的实现思路

Python 并发限流的核心目标是控制同时执行的任务数量,防止资源过载(如数据库连接耗尽、API 调用超频、CPU 或内存打满)。实现思路不依赖单一方案,而是按场景选择合适机制:轻量级用信号量或线程池控制并发数,分布式需引入外部协调(如 Redis),高精度限流则用令牌桶或漏桶算法。

基于 threading.Semaphore 的简单并发控制

适用于单进程内多线程/多协程(配合 asyncio)的粗粒度限流。Semaphore 本质是一个计数器,acquire() 减一、release() 加一,超出初始值时阻塞等待。

常见写法:

  • 初始化 red">sem = Semaphore(n),n 即最大并发数
  • 每个任务执行前调用 sem.acquire(),结束后必须 sem.release()(建议用 try/finally 或上下文管理器)
  • asyncio 中可用 asyncio.Semaphore,配合 async with sem: 更安全

利用 concurrent.futures.ThreadPoolExecutorProcessPoolExecutor

这是更“Pythonic”的方式——不手动管信号量,而是把限流逻辑交给执行器本身。max_workers 参数直接限制线程/进程数,底层自动排队调度。

立即学习Python免费学习笔记(深入)”;

绘蛙
绘蛙

电商场景的AI创作平台,无需高薪聘请商拍和文案团队,使用绘蛙即可低成本、批量创作优质的商拍图、种草文案

下载

优势明显:

  • 自带任务队列和异常传播,无需手动处理阻塞与释放
  • 支持 submit() 提交单个任务,或 map() 批量分发,返回 Future 对象便于结果收集
  • 适合 I/O 密集型(用 ThreadPoolExecutor)或 CPU 密集型(用 ProcessPoolExecutor)场景

分布式环境下的限流:Redis + Lua 原子操作

单机限流在微服务或多实例部署下失效,需共享状态。Redis 是常用选择,关键在于保证“检查+更新”原子性,避免竞态条件。

典型做法:

  • 用 Redis 的 INCR + EXPIRE 组合模拟滑动窗口,但存在临界问题;更稳妥的是用 Lua 脚本封装整个限流逻辑
  • 例如:脚本读取当前计数、判断是否超限、未超则 INCR 并设置过期时间,全程在 Redis 内原子执行
  • Python 端通过 redis-py 调用 eval() 方法传入脚本和参数,返回布尔值表示是否允许通过

精细化速率控制:令牌桶(Token Bucket)实现

当需要按“QPS”或“每秒请求数”动态限流(而非单纯控并发数),令牌桶更贴切。它以恒定速率向桶中添加令牌,每次请求消耗一个令牌,桶满则丢弃新令牌。

可选实现路径:

  • 单机:用 time.time() 记录上次填充时间,按间隔计算应新增令牌数,维护一个浮点数计数器
  • 分布式:将桶状态存 Redis,用 Lua 更新(如 key 存 last_time 和 tokens,每次请求脚本计算并返回是否允许)
  • 第三方库如 pyrate-limiter 已封装多种算法(令牌桶、漏桶、滑动窗口),支持内存/Redis 后端,开箱即用

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

407

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

251

2023.10.07

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6609

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

842

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1092

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2184

2024.03.01

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

377

2025.12.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号