全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python异步系统学习路线第259讲_核心原理与实战案例详解【教程】

asyncio.run()只能调用一次,因其内部创建并关闭事件循环;await后必须是真正的awaitable对象,如asyncio.sleep而非time.sleep;create_task()实现并发调度,而直接await则顺序执行。

这标题看着像教程,实际不是入门向内容——asyncio 的核心原理和实战案例,真正卡住人的从来不是语法,而是事件循环怎么调度、协程对象怎么挂起、await 底层怎么触发状态切换。

asyncio.run() 为什么只能调用一次?

因为 asyncio.run() 内部会创建新事件循环、运行完就关闭。再调用就会报 RuntimeError: asyncio.run() cannot be called from a running event loop

  • 开发时别在 Jupyter 或已启动 asyncio 的环境中反复执行 asyncio.run(main())
  • 想多次运行,改用 asyncio.get_event_loop().run_until_complete(main())(注意:Python 3.10+ 推荐用 asyncio.new_event_loop() + set_event_loop() 显式管理)
  • asyncio.run() 隐含了 loop.close(),关闭后无法复用

await 后面必须是 awaitable,但不是所有“能 await 的东西”都安全

比如 await time.sleep(1) 看似合理,实则阻塞整个事件循环——time.sleep 是同步阻塞函数,根本不是 awaitable。

  • 正确做法是用 await asyncio.sleep(1)
  • 第三方库如 requests 没有异步支持,直接 await requests.get(...) 会报 TypeError: object Response can't be used in 'await' expression
  • 数据库操作要用 aiomysqlasyncpgmotor 这类原生 async 驱动,不能套壳 await loop.run_in_executor(..., sqlite3.connect)(虽可行但掩盖问题)

asyncio.create_task() 和直接 await 的区别不只是“后台执行”

关键在于调度时机:await coro 是立即进入并阻塞等待完成;asyncio.create_task(coro) 把协程注册进事件循环,当前函数可继续往下走,下次循环 tick 才开始执行。

import asyncio

async def say(what, delay):
    await asyncio.sleep(delay)
    print(what)

async def main():
    task1 = asyncio.create_task(say("hello", 2))
    task2 = asyncio.create_task(say("world", 1))
    print("tasks created")
    await task1
    await task2

asyncio.run(main())

输出顺序是:tasks created → world → hello。如果写成 await say("hello", 2),那 say("world", 1) 就得等 2 秒后才开始。

async with 和 async for 不是语法糖,它们依赖 __aenter__/__aexit__ 和 __aiter__/__anext__

没实现这些方法的对象,哪怕加了 async 前缀,也不能用于 async with。常见坑:

  • aiofiles.open() 可以,open() 不行
  • aiomysql.Pool 支持 async with pool.acquire(),但自己写的普通上下文管理器加 async 不等于自动支持
  • async for line in file: 要求 file 实现 __aiter__,不是所有文件对象都满足(比如 io.StringIO 就不行)
真正难的不是写 async def,是理解「谁在什么时候让出控制权」「事件循环在哪一刻把哪个协程切回来」。调试时多打 print(f"at {inspect.currentframe().f_lineno}"),比看文档更快定位挂起点。


# mysql  # python  # ai  # 区别  # 为什么 


相关文章: 番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  制作农业网站的软件,比较好的农业网站推荐一下?  已有域名如何免费搭建网站?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  昆明高端网站制作公司,昆明公租房申请网上登录入口?  如何在腾讯云免费申请建站?  建站主机功能解析:服务器选择与快速搭建指南  ,制作一个手机app网站要多少钱?  如何用虚拟主机快速搭建网站?详细步骤解析  如何用搬瓦工VPS快速搭建个人网站?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  制作网站的公司有哪些,做一个公司网站要多少钱?  在线制作视频网站免费,都有哪些好的动漫网站?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  深圳网站制作的公司有哪些,dido官方网站?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何正确选择百度移动适配建站域名?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  如何通过远程VPS快速搭建个人网站?  如何零基础开发自助建站系统?完整教程解析  建站之星×万网:智能建站系统+自助建站平台一键生成  如何确认建站备案号应放置的具体位置?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  建站主机选购指南与交易推荐:核心配置解析  如何用好域名打造高点击率的自主建站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  内部网站制作流程,如何建立公司内部网站?  如何快速搭建高效简练网站?  常州自助建站费用包含哪些项目?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  C++中引用和指针有什么区别?(代码说明)  如何做静态网页,sublimetext3.0制作静态网页?  制作旅游网站html,怎样注册旅游网站?  如何挑选最适合建站的高性能VPS主机?  如何快速搭建个人网站并优化SEO?  如何在阿里云ECS服务器部署织梦CMS网站?  如何在IIS中新建站点并配置端口与物理路径?  山东网站制作公司有哪些,山东大源集团官网?  香港服务器租用费用高吗?如何避免常见误区?  微信推文制作网站有哪些,怎么做微信推文,急?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  孙琪峥织梦建站教程如何优化数据库安全?  安徽网站建设与外贸建站服务专业定制方案 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。