自学内容网 自学内容网

前端的 Python 入门指南(七):异步场景的实现方案对比 - 内置+显示事件循环 + async+await

《前端的 Python 入门指南》系列文章:

在现代开发中,无论是前端还是后端,异步编程 都是不可或缺的一部分。前端开发者可能已经熟悉 JavaScript 的异步模型,包括回调函数、Promiseasync/await。而在 Python 中,异步编程也越来越重要,特别是在需要处理大量 I/O 操作(如网络请求或文件读写)时。

本文将对比 JavaScript 和 Python 在异步场景中的实现方案,分析它们的优缺点,帮助前端开发者更好地理解和应用 Python 的异步特性。


1. 异步模型的基础概念

JavaScript 的事件循环

JavaScript 基于 事件循环(Event Loop) 实现异步:

  • 单线程模型:主线程负责执行代码和事件处理。
  • 异步任务被添加到任务队列中,由事件循环逐一处理。

常见异步场景:

  • 定时器:setTimeout/setInterval
  • DOM 事件:addEventListener
  • 网络请求:fetch/XMLHttpRequest

Python 的事件循环

Python 的异步模型从 Python 3.5 开始引入,基于 asyncio 框架:

  • Python 的事件循环类似于 JavaScript,但需要显式创建和运行。
  • 通过 asyncawait 实现异步函数,简化了异步编程。

2. 常见异步实现方案对比

特性JavaScriptPython
回调函数通过回调实现异步任务可通过 asyncio 的回调实现,但较少使用
Promise/FuturePromise 是标准异步模式,支持链式调用Future 是低层封装,asyncio 广泛使用
async/await简化了异步语法,异步编程更直观从 Python 3.5 开始支持,与 JS 类似
事件循环自动运行,隐藏在引擎中需要显式创建和运行,使用 asyncio.run

3. 回调函数实现异步

JavaScript:回调地狱

早期的 JavaScript 异步编程主要依赖回调函数,但嵌套过多时会形成“回调地狱”。

setTimeout(() => {
    console.log("First task done");
    setTimeout(() => {
        console.log("Second task done");
        setTimeout(() => {
            console.log("Third task done");
        }, 1000);
    }, 1000);
}, 1000);

Python:通过 asyncio 使用回调

在 Python 中,可以通过 asyncio 的回调机制实现类似功能,但使用较少,原因是 async/await 更推荐。

import asyncio

async def first_task():
    print("First task done")
    await asyncio.sleep(1)
    print("Second task done")
    await asyncio.sleep(1)
    print("Third task done")

asyncio.run(first_task())

对比

  • JavaScript 中回调函数的嵌套容易导致代码难以维护。
  • Python 更倾向于直接使用 async/await,即便是异步链式调用,代码也更易读。

4. Promise/Future 实现异步

JavaScript 的 Promise

Promise 是 JavaScript 的核心异步实现之一,提供了链式调用,解决了回调地狱的问题。

new Promise((resolve) => {
    setTimeout(() => resolve("First task done"), 1000);
}).then((result) => {
    console.log(result);
    return new Promise((resolve) => setTimeout(() => resolve("Second task done"), 1000));
}).then((result) => {
    console.log(result);
});

Python 的 Future

Python 的 Future 类似于 JavaScript 的 Promise,表示一个尚未完成的异步操作,通常由 asyncio 框架管理。

import asyncio

async def first_task():
    await asyncio.sleep(1)
    print("First task done")
    return "First result"

async def second_task():
    await asyncio.sleep(1)
    print("Second task done")
    return "Second result"

async def main():
    first = await first_task()
    print(first)
    second = await second_task()
    print(second)

asyncio.run(main())

对比

  • JavaScript 的 Promise 是语言内置的,使用链式调用更常见。
  • Python 的 Future 通常由 asyncio 自动管理,开发者更多使用 async/await

5. async/await 的对比

JavaScript 的 async/await

async/await 是 JavaScript 异步编程的终极方案,让异步代码看起来像同步代码。

async function fetchData() {
    const response = await fetch("https://api.example.com/data");
    const data = await response.json();
    console.log(data);
}

fetchData();

Python 的 async/await

Python 从 3.5 版本开始引入 async/await,大幅提升了异步代码的可读性。

import asyncio

async def fetch_data():
    await asyncio.sleep(1)  # 模拟异步请求
    print("Data fetched")

asyncio.run(fetch_data())

对比

  • async/await 在 JavaScript 和 Python 中语法几乎一致,前端开发者可以快速适应。
  • Python 的异步场景更适合处理 I/O 密集型任务,而 JavaScript 异步更多用于浏览器环境下的事件驱动。

6. 事件循环的实现对比

JavaScript 的事件循环

JavaScript 的事件循环是引擎的一部分,开发者无需手动管理。

示例:
console.log("Start");

setTimeout(() => {
    console.log("Timeout");
}, 0);

console.log("End");

输出

Start
End
Timeout

Python 的事件循环

Python 的事件循环需要通过 asyncio 显式创建和运行。

示例:
import asyncio

async def main():
    print("Start")
    await asyncio.sleep(0)
    print("End")

asyncio.run(main())

输出

Start
End

7. 优缺点对比

特性JavaScriptPython
异步支持原生支持,异步模型成熟Python 3.5+ 引入异步,发展较晚
事件循环自动运行,隐藏在引擎中需要显式管理,灵活性更高
语法易用性async/await 易用,Promise 支持链式调用async/await 易用,语法与 JS 类似
适用场景浏览器环境,事件驱动异步任务I/O 密集型任务,如文件读写、网络请求
性能单线程事件驱动,适合轻量级异步任务通过 asyncio 和多线程/多进程提高并发能力

8. 总结与建议

何时选择 JavaScript 异步

  • 实时交互:如用户事件、DOM 操作和网络请求。
  • 动态更新:如动态加载数据并更新页面。

何时选择 Python 异步

  • I/O 密集型任务:如高并发网络请求、大文件处理。
  • 后端服务:如异步 Web 服务(Django、FastAPI)。

学习建议

  1. 对前端开发者来说,Python 的 async/await 语法几乎与 JavaScript 完全一致,上手非常容易。
  2. 如果需要处理异步任务,建议优先使用 asyncio 提供的工具,而不是低层的 Future
  3. 熟悉 Python 的事件循环和任务调度机制,可以更高效地处理 I/O 密集型应用。

异步编程虽然看起来复杂,但掌握后会让你的开发效率和代码质量提升一个新台阶!(•̀ᴗ•́)و 继续加油吧!

顺便推荐一下继续写的神经网络系列 Brain.js(十):GRUTimeStep 实战教程 - 股市指数预测以及与 LSTMTimeStep 对比


原文地址:https://blog.csdn.net/m0_38015699/article/details/144294171

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!