0

0

Python怎么做长轮询_Long Polling实现与异步请求挂起

P粉602998670

P粉602998670

发布时间:2026-03-17 11:32:31

|

667人浏览过

|

来源于php中文网

原创

长轮询在Flask中禁用time.sleep()因其阻塞worker进程;应选用FastAPI等异步框架或gevent协程模式;需配置Nginx proxy_read_timeout、使用asyncio.wait_for防止无限等待、Redis改用aioredis异步API,并做好超时与事件竞争的双保险处理。

python怎么做长轮询_long polling实现与异步请求挂起

长轮询为什么不能用 time.sleep() 在 Flask 里硬等

因为 Flask 默认是同步阻塞模型,time.sleep() 会卡住整个 worker 进程,一个请求挂起,其他请求就得排队。这不是“挂起”,是“堵死”。真正要的是让单个请求暂停响应,但不占着线程或进程资源。

实操建议:

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

  • 必须用异步框架(如 FastAPI + async/await)或支持异步的 WSGI 替代品(如 Uvicorn + Starlette),纯 Flask + Gunicorn 默认配置无法安全做长轮询
  • 如果非要用 Flask,得配合 geventeventlet 并启用协程模式,且所有 I/O 操作(比如查 Redis、调下游 API)都得是协程友好的,否则照样阻塞
  • 别在视图函数里写 while not event.is_set(): time.sleep(0.5) —— 这是典型错误现象:CPU 空转 + 响应延迟不可控 + 容易超时

asyncio.wait_for()asyncio.Event.wait() 怎么配对用才不丢事件

长轮询本质是“等一个外部信号”,比如消息到达、状态变更。用 asyncio.Event 做信号载体最轻量,但直接 await event.wait() 可能永远不返回——比如事件被 set 后又 reset,或者超时没处理好。

实操建议:

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

  • 必须套一层 asyncio.wait_for(event.wait(), timeout=30),否则客户端可能无限等待,后端也没法主动断开
  • 捕获 asyncio.TimeoutError 后,要显式 return JSONResponse({"data": null, "status": "timeout"}),而不是抛异常或忽略
  • 事件触发后记得 event.clear(),否则下次请求进来立刻返回,变成“短轮询”;但 clear() 要在响应发出后、下一次等待前执行,顺序错了就丢事件

客户端发长轮询请求,为什么反复收到 502 Bad Gateway 或连接被重置

不是代码问题,是中间层(Nginx、ALB、Cloudflare)默认把“空闲连接”当异常关掉。它们通常有 60 秒左右的 idle timeout,而长轮询故意要等更久。

Primeshot
Primeshot

专业级AI人像摄影工作室

下载

实操建议:

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

  • Nginx 配置里必须加:proxy_read_timeout 90(比你的最大等待时间多 10 秒)、proxy_http_version 1.1proxy_set_header Connection ''
  • 如果用 AWS ALB,要在 Target Group 设置里调高 Idle timeout(默认 60,建议设为 90–120)
  • 客户端 JS 里用 fetch() 发请求时,别设 signal timeout 小于后端等待时间,否则前端先放弃,还可能触发重复请求

用 Redis Pub/Sub 做事件源,为什么 redis-pypubsub.listen() 在 async 环境里会卡住

redis-py 默认的 PubSub.listen() 是同步阻塞调用,放进 async 函数里会直接让整个协程停摆。它不兼容 asyncio 事件循环。

实操建议:

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

  • 改用 aioredis(v2)或 redis-py v4+ 的 async API:pubsub.subscribe("channel") 返回的是协程,必须 await
  • 别在 while True: 里循环 await pubsub.get_message(ignore_subscribe_messages=True) —— 这会频繁唤醒协程,浪费 CPU;应该用 await pubsub.subscribe(...) 后监听 async for message in pubsub.listen():
  • 注意 aioredis v2 不再维护,v3 是纯异步但 API 大改;如果项目已用 v2,升级前先确认所有 redis.Redis() 实例都换成了 redis.Redis.from_url(..., decode_responses=True) 再 await

最麻烦的其实是超时与事件竞争:客户端等了 25 秒,第 26 秒消息来了,但 Nginx 在第 30 秒断连,后端还没来得及写响应头——这种边界情况得靠双保险:后端设略短于反向代理的 timeout,客户端也设略短于后端的 fetch timeout,并且每次重连带递增退避。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

522

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

610

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

245

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

739

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3619

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

60

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

74

2026.01.13

c++ 字符处理
c++ 字符处理

本专题整合了c++字符处理教程、字符串处理函数相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

热门下载

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

精品课程

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

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 2万人学习

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

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