当前位置: 首页 > news >正文

Python 的协程模型和 JavaScript 的 async/await

Python 的协程模型和 JavaScript 的 async/await 非常像,因为:

Python 的 asyncio 在设计上大量借鉴了 JavaScript 的 Promise + Event Loop 模型。

尤其是:

JavaScript Python
async function async def
await await
Promise Future / Task
Event Loop Event Loop
单线程异步 IO 单线程异步 IO

所以如果你熟悉 JS,再学 Python 协程会轻松很多。


一、最直观对比

JavaScript

async function hello() {console.log("start");await fetch("/api");console.log("end");
}

Python

import asyncioasync def hello():print("start")await asyncio.sleep(1)print("end")

结构几乎一样。


二、两者核心思想完全一致

本质都是:

遇到 await↓
暂停当前函数↓
把控制权交回事件循环↓
等待 IO 完成↓
恢复执行

这就是:

协作式并发(cooperative concurrency)

三、对应关系

1. async function vs async def

JavaScript:

async function f() {}

Python:

async def f():pass

它们都:

  • 定义“异步函数”
  • 调用后不会立即执行完
  • 返回“可等待对象”

四、Promise vs Coroutine

这是两者一个重要区别。


JavaScript

async 函数返回:

Promise

例如:

async function f() {return 123;
}console.log(f())

输出:

Promise { 123 }

Python

async def 返回:

coroutine object

例如:

async def f():return 123print(f())

输出:

<coroutine object>

五、await 的意义相同

JS:

await fetch(...)

Python:

await session.get(...)

都表示:

“这里可能要等待,先切出去执行别的任务。”


六、事件循环也非常像


JavaScript Event Loop

浏览器 / Node.js:

call stack
task queue
microtask queue
event loop

Python asyncio Event Loop

ready queue
selector/epoll
callback queue
task scheduler

思想高度一致:

谁 IO 完成了↓
恢复谁执行

七、Task 和 Promise 很像


JS

const p = fetch("/api");

p 是 Promise。


Python

task = asyncio.create_task(work())

task 是 Task。

都表示:

一个未来会完成的异步任务

八、并发执行方式也类似


JavaScript

await Promise.all([fetch("/a"),fetch("/b")
])

Python

await asyncio.gather(fetch_a(),fetch_b(),
)

几乎一模一样。


九、最大区别:Python 更底层

JS 的 async/await:

  • 主要围绕 Promise
  • 浏览器/Node 封装很多东西
  • 使用更“自动化”

Python:

  • coroutine
  • Future
  • Task
  • EventLoop

这些概念暴露更多。

所以 Python asyncio:

  • 更灵活
  • 也更复杂

十、Python 协程真正来源于生成器

这是和 JS 最大的历史区别。

JavaScript async:

Promise 驱动

而 Python 协程:

generator/yield 演化而来

所以 Python 有:

  • yield
  • yield from
  • send()
  • throw()
  • close()

这些底层机制。

JS 没这么复杂。


十一、Python 有“原生协程”和“生成器协程”历史包袱

早期 Python:

@asyncio.coroutine
def f():yield from ...

后来才有:

async def
await

所以 Python 协程体系有明显演化痕迹。

而 JS 基本一步到位:

callback
→ Promise
→ async/await

十二、Node.js 和 FastAPI 为什么都喜欢 async?

因为:

Web 服务本质是 IO 密集

大量时间在:

  • 等数据库
  • 等 HTTP
  • 等 Redis
  • 等磁盘

async 模型非常适合。

所以:

  • Node.js
  • FastAPI
  • aiohttp

都 heavily async。


十三、但 Python async 有一个重要限制

Python:

async != 多线程

它默认还是:

单线程事件循环

因此:

await cpu_heavy()

不会 magically 并行。

CPU 密集任务仍需要:

  • 多进程
  • 线程池
  • C扩展

这一点 JS 也类似。


十四、你如果有 JS 背景,会很快理解这些

你会发现:

JS 概念 Python 概念
Promise Future
Promise.all asyncio.gather
setTimeout asyncio.sleep
async function async def
await await
Event Loop Event Loop

真正需要重新适应的是:

Python coroutine object / Task / Future 的区别

这比 JS 更细。


十五、一个非常关键的区别

JS:

fetch("/api")

会立刻开始请求。


Python:

coro = fetch()

很多时候:

只是创建 coroutine object
并不会立刻执行

必须:

await coro

或者:

asyncio.create_task(coro)

才真正调度。

这是很多 JS 开发者刚转 Python 时最容易踩坑的地方。

http://www.jsqmd.com/news/809062/

相关文章:

  • 嵌入式系统演进:从资源受限到异构计算与开源生态的工程实践
  • 量子计算原子阵列组装:算法突破与工程实践
  • 东莞市百鑫资源再生利用:东莞市稀有金属回收推荐几家 - LYL仔仔
  • 从选型到调试:STM32H750VBT6的DSP、FPU双核武器库,CubeMX配置避坑全记录
  • CORP开源协作平台:基于Markdown与Git的下一代协作范式
  • 终极指南:3分钟解决Windows 10/11音频增强软件兼容性问题
  • 珠海港式火锅品控技术拆解:从汤底到场景的硬核逻辑 - 奔跑123
  • 揭秘JD-GUI:3个高级场景下Java反编译的实战应用
  • 2026年山东充电桩SaaS运营系统深度横评:社区生态物联一站式解决方案与资金扶持对比指南 - 企业名录优选推荐
  • PyQt5到PyQt6迁移实战:核心变更点、适配策略与未来展望
  • 深度探索:Windows上的安卓应用安装革命,5个步骤实现跨平台无缝体验
  • 2026年江苏无锡充电桩运营系统深度横评:从技术贴牌到资金赋能的全场景解决方案 - 企业名录优选推荐
  • 教育机构构建ai编程教学平台时采用taotoken统一管理学生token资源的方案
  • 2026上海冷冻冷库安装公司电话,专业保鲜冷库安装服务快速对接 - 品牌2025
  • Cursor Pro破解工具:5步实现永久免费使用的完整方案
  • 爱思唯尔把Meta告了:拿Sci-Hub盗版论文训练大模型
  • 在nodejs后端服务中集成taotoken实现多轮对话的异步处理
  • ArcGIS标注转注记实战:手把手教你制作可精细编辑的河流流向标注
  • 2026年河南充电桩运营系统与社区生态物联解决方案深度横评:SaaS贴牌定制与资金扶持选购指南 - 企业名录优选推荐
  • AI灭绝风险分类与防御:从无意边缘化到有意攻击的全景分析
  • CentOS 7下VNC连接黑屏/只有鼠标?手把手排查GNOME+VNC的常见坑(附解决方案)
  • 工程思维跨界精酿:从电路板到啤酒桶的系统化创新实践
  • 公众号附件添加工具(90%小编都在用)政企云文档小程序 - 政企云文档
  • OpenClawRouter:基于Arch Linux与Docker的一体化软路由系统实践
  • 博客501:从零解析NVIDIA Container Toolkit,解锁GPU容器化新姿势
  • 河南省郑州市美业培训学校怎么选?40年经验拆解与沙宣学校等5家机构对比 - 深度智识库
  • 【Midjourney 8x10大画幅终极指南】:20年AI影像专家亲授——如何突破分辨率瓶颈、规避长宽比畸变并生成印刷级输出?
  • CMake实战:一个项目如何同时生成Debug和Release两个可执行文件?
  • 济南实木全屋定制工厂选哪家?本地源头工厂直营更靠谱15564131221 - 新闻快传
  • 终极CS比赛回放分析工具:CS Demo Manager完整指南