Python异步编程实践 Python asyncio事件循环机制解析

事件循环是python异步编程的核心机制,负责调度和运行协程。1. asyncio.run() 是启动事件循环的推荐方式,适用于大多数情况;2. 在需手动获取事件循环时,应优先使用 asyncio.get_running_loop();3. 事件循环通过“就绪队列”管理任务,在 await 遇到 i/o 等待时切换任务以实现并发;4. 使用 create_task() 将协程封装为任务提交给事件循环执行;5. 避免阻塞主线程,可用 loop.run_in_executor() 处理同步阻塞或cpu密集型任务;6. 多线程中需为每个线程绑定独立事件循环。正确理解并应用这些机制,有助于编写高效稳定的异步程序。

Python异步编程实践 Python asyncio事件循环机制解析

Python 的异步编程在处理高并发、I/O 密集型任务时非常有用,而 asyncio 是 Python 官方提供的异步框架。理解它的事件循环机制是掌握异步编程的关键。

什么是事件循环?

事件循环(Event Loop)是 asyncio 的核心,它负责调度和运行协程。你可以把它想象成一个无限循环,不断检查是否有任务需要执行,并在合适的时候调度它们。

在 Python 3.7+ 中,通常使用 asyncio.run() 来启动主函数,它会自动创建并管理事件循环。但如果你需要更细粒度的控制,比如在 Jupyter 或某些嵌入式环境中,可能需要手动获取或创建事件循环。

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

例如:

import asyncioasync def main():    print("Hello")    await asyncio.sleep(1)    print("World")asyncio.run(main())

在这个例子中,asyncio.run() 启动了事件循环,然后把 main() 协程加入其中,事件循环会负责调度它的执行。

如何正确获取和使用事件循环?

在某些情况下,你可能需要手动获取当前的事件循环。比如,在 Jupyter Notebook 中直接使用 asyncio.run() 可能会报错,因为事件循环已经存在。

常见的做法是使用以下方式之一来获取事件循环:

在主线程中:loop = asyncio.get_event_loop()在子线程中:loop = asyncio.new_event_loop()推荐(适用于大多数情况):loop = asyncio.get_running_loop()

需要注意的是:

get_event_loop() 已逐渐不推荐使用,尤其是在 Python 3.9+ 中。get_running_loop() 更安全,但如果不在事件循环内部调用会抛出异常。

事件循环是如何调度任务的?

事件循环并不是一上来就把所有协程都跑完,而是通过“事件”驱动的方式进行调度。

举个简单的例子:

async def task1():    print("Task1 started")    await asyncio.sleep(2)    print("Task1 done")async def task2():    print("Task2 started")    await asyncio.sleep(1)    print("Task2 done")async def main():    t1 = asyncio.create_task(task1())    t2 = asyncio.create_task(task2())    await t1    await t2asyncio.run(main())

在这个例子中,task1task2 被同时提交给事件循环。当其中一个遇到 await asyncio.sleep() 时,事件循环会切换到另一个任务继续执行,从而实现并发效果。

关键点在于:

使用 create_task() 把协程封装成任务并交给事件循环。await 某个任务表示等待它完成,但期间可以调度其他任务。事件循环内部维护了一个“就绪队列”,每次从队列中取出任务执行。

常见问题与注意事项

不要混用不同的事件循环库

比如,不要在同一程序中混用 asyncioTornado 的事件循环,除非你清楚自己在做什么。否则容易导致死锁或调度混乱。

避免阻塞主线程

如果你在事件循环中执行同步阻塞操作(如长时间计算、普通 time.sleep()),整个异步流程都会被卡住。解决办法是:

使用 await asyncio.sleep() 替代 time.sleep()对于 CPU 密集任务,考虑用 loop.run_in_executor() 放到线程或进程中执行

def blocking_function():    time.sleep(5)    return "Done"async def main():    loop = asyncio.get_running_loop()    result = await loop.run_in_executor(None, blocking_function)    print(result)asyncio.run(main())

注意多线程中的事件循环

如果你在一个非主线程中使用事件循环,记得先为该线程绑定一个新的事件循环:

import threadingdef thread_main():    loop = asyncio.new_event_loop()    asyncio.set_event_loop(loop)    loop.run_until_complete(main())threading.Thread(target=thread_main).start()

否则可能会出现找不到事件循环的问题。

基本上就这些。事件循环虽然看起来复杂,但只要理解它是如何调度协程、如何避免阻塞,以及在不同环境下如何正确使用,就能比较顺利地写出高效的异步代码了。

以上就是Python异步编程实践 Python asyncio事件循环机制解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1362439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python计算机视觉 Python OpenCV图像处理技巧
上一篇 2025年12月14日 01:48:24
下一篇 2025年12月14日 01:48:33

相关推荐

  • VSCode如何实现代码版本对比 VSCode Git差异对比的高效使用方法

    vscode通过scm视图直接对比工作区与head的差异;2. 点击已暂存文件可查看暂存区与head的差异;3. 通过命令面板、scm历史记录或右键菜单可对比任意版本或文件;4. 差异视图支持并排和内联模式,并提供跳转导航;5. 时间线视图可追溯文件级提交历史并对比各版本;6. gitlens扩展增…

    2026年9月23日
    500
  • mysql索引怎么用 mysql创建索引提高查询性能方法

    mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法

    索引是mysql中提高查询性能的关键工具,它类似于书籍目录,可快速定位数据。创建索引主要使用create index或alter table语句,例如:create index idx_email on users (email); 或 alter table users add index idx…

    2026年9月23日 用户投稿
    000
  • Java中基于栈验证JSON字符串结构有效性的方法

    本文探讨了在Java中利用栈(Stack)数据结构验证JSON字符串结构有效性的方法。我们将分析一个常见的基于栈的实现示例,指出其在处理字符串内部字符、引号平衡以及转义字符方面的潜在缺陷。文章将提供一个改进的解决方案,并强调此方法主要用于结构匹配,而非完整的JSON语法验证,同时建议生产环境中使用专…

    2026年9月23日
    100
  • 快手极速版官方网页版地址_快手极速版App下载官网首页

    快手极速版官方网页版地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来快手极速版官方网页版地址及App下载相关信息,感兴趣的网友一起随小编来瞧瞧吧! https://www.kuaishou.com/ 1、小步骤内容。进入官网后可直接浏览平台首页推荐内容,涵盖生活记录、才艺展示等多个领域…

    2026年9月23日
    200
  • Flink项目实践 | Flink 单机安装部署

    Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署

    apache flink 是一个用于对无界和有界数据流进行状态计算的框架和分布式处理引擎。flink 设计旨在所有常见集群环境中运行,并以内存速度和任意规模进行计算。 为了深入了解 Flink,首先需要搭建其运行环境。 Flink 可以在所有类似 UNIX 的环境中运行,包括 Linux,Mac O…

    2026年9月23日 用户投稿
    200
  • Windows系统安装MySQL的完整步骤是什么?

    Windows系统安装MySQL的完整步骤是什么?Windows系统安装MySQL的完整步骤是什么?Windows系统安装MySQL的完整步骤是什么?Windows系统安装MySQL的完整步骤是什么?

    安装#%#$#%@%@%$#%$#%#%#$%@_81c++3b080dad537de7e10e0987a4bf52e前需准备系统兼容性、硬件资源、前置运行时库、管理员权限及排查端口冲突。1. 系统兼容性:确保使用windows 10/11或对应server版本;2. 硬件资源:建议至少4gb内存;…

    2026年9月23日 用户投稿
    100
  • 如何在AdobeFresco导出AI生成的画作?快速保存图像的教程

    答案:Adobe Fresco支持PNG、JPG、PSD、PDF和MP4等导出格式。PNG适合透明背景和高质量网络展示;JPG适用于小文件、快速分享的有损压缩图像;PSD保留图层与矢量信息,便于在Photoshop中继续编辑;PDF适合打印和跨平台文档共享;MP4用于导出创作延时视频。选择格式时需根…

    2026年9月23日
    100
  • VSCode配置MacOS C环境 详细图解VSCode搭建C++开发

    在mac++os上用vscode配置c/c++环境的关键是安装xcode command line tools以获取clang编译器和lldb调试器,然后安装vscode的c/c++扩展,接着创建项目文件夹和源文件,通过配置tasks.json定义编译任务,确保使用clang编译当前文件并生成可执行…

    2026年9月23日
    100
  • Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit虽无一键AI裁剪,但通过魔棒、智能移动等智能工具辅助选区,结合裁剪功能可高效精准裁剪;关键在于利用颜色识别与对象分离技术提升效率,避免纯手动操作,再通过调整比例、放大细节、善用撤销等功能优化结果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R…

    2026年9月23日 用户投稿
    000
  • Java javac 命令与当前工作目录解析

    在Java编译环境中,javac命令的“当前目录”指的是命令被执行的物理位置,而非源文件所在的目录。理解这一概念对于正确配置和管理Java项目的编译路径至关重要,特别是当默认的classpath设置为.时,它决定了编译器查找类文件的起点。 1. javac 命令与当前工作目录的定义 在操作系统中,当…

    2026年9月23日
    100
  • 苹果 iPhone Air 今日正式发售:仅支持 eSIM,起售价 7999 元

    10 月 22 日消息,苹果全新 iphone air 于今日上午 8:00 正式开售,起售价定为 7999 元。值得关注的是,该机型仅支持 esim 功能,用户需持本人有效身份证件前往运营商实体营业厅完成实名核验与服务激活。现阶段仍处于商用试验阶段,暂未开放线上办理通道。 iPhone Air 搭…

    2026年9月23日
    200
  • VSCode调试JavaScript代码(详细图解,前端必学技能)

    掌握VSCode调试JavaScript需先安装Node.js和VSCode,创建项目及app.js文件后,配置launch.json,设置断点并启动调试,通过变量面板和控制台检查值,结合条件断点、日志点、监听表达式等技巧提升效率;调试浏览器代码需安装Chrome或Edge调试插件,配置url和we…

    2026年9月23日
    200
  • Bash Shell 中单引号和双引号的区别

    Bash Shell 中单引号和双引号的区别Bash Shell 中单引号和双引号的区别Bash Shell 中单引号和双引号的区别Bash Shell 中单引号和双引号的区别

    在 linux 命令行中,引号是处理文件名中的空格和特殊字符的常用工具。引号在 shell 脚本中具有“特殊功能”,可能让初学者感到困惑。让我们详细探讨不同类型的引号字符及其在 shell 脚本中的用法。 有四种不同类型的引号字符: 单引号 ‘双引号 “反斜杠 反引号 ` 除…

    2026年9月23日 用户投稿
    500
  • Linux中如何查看服务日志?journalctl与syslog使用指南

    Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南

    排查linux服务问题时,首选journalctl或syslog类系统查看日志。journalctl适用于systemd系统,可查看内核消息、服务启动输出等,支持按时间、单元、优先级过滤;syslog适用于传统系统,需服务主动发送日志,支持集中管理。掌握两者使用能有效定位问题。 在Linux系统中排…

    2026年9月23日 用户投稿
    100
  • Java语法基础中main方法为什么必须是public static void

    Main方法必须声明为public static void以确保JVM能无访问限制地通过类名直接调用,且不依赖对象实例或返回值,符合JVM规范对程序入口的强制要求。 Main方法是Java程序的入口点,它的标准声明形式为:public static void main(String[] args)。…

    2026年9月23日
    200
  • ElevenLabs的AI混合工具怎么用?生成逼真语音的详细操作教程

    ElevenLabs的AI混合工具核心在于VoiceLab功能,结合Voice Design与Instant Voice Cloning实现声音的精细调控与克隆。通过参数调整和高质量音频输入,用户可从零设计或克隆声音,并经反复迭代优化情感表达与自然度。其优势在于对声音细节的精准控制、克隆的真实感及灵…

    2026年9月23日
    100
  • 优化 Laravel Nova 动作响应消息的持久性与交互性

    本文探讨了 Laravel Nova 动作响应消息(toast 提示)持续时间过短的问题,尤其对于耗时较长的操作,默认提示难以满足用户反馈需求。我们提出并详细介绍了如何利用 Laravel Nova 4 的通知功能,实现持久化且可交互的用户通知,从而有效解决传统 toast 消息的局限性,提升用户体…

    2026年9月23日
    400
  • Reflection AI 完成 20 亿美元融资,打造“开放智能”

    美国人工智能初创企业 reflection ai 宣布成功募集 20 亿美元资金,其中英伟达领衔投资 8 亿美元,推动公司估值跃升至 80 亿美元。这家成立仅一年的科技新星,致力于打造“人人可及的前沿开放智能(open intelligence)”。 Reflection AI 表示,已集结一支由顶…

    2026年9月23日
    500
  • mysql安装完如何优化 mysql基础性能调优配置建议

    mysql安装完如何优化 mysql基础性能调优配置建议mysql安装完如何优化 mysql基础性能调优配置建议mysql安装完如何优化 mysql基础性能调优配置建议mysql安装完如何优化 mysql基础性能调优配置建议

    安装完 mysql 后需进行基础配置调优以提升性能,主要包括以下五点:1. 设置 innodb_buffer_pool_size 为物理内存的50%~80%,如16g内存可设为12g;2. 调整 max_connections 至合理并发数如500,并设置 wait_timeout 和 intera…

    2026年9月23日 用户投稿
    400
  • [272]如何把Python脚本导出为exe程序

    [272]如何把Python脚本导出为exe程序[272]如何把Python脚本导出为exe程序[272]如何把Python脚本导出为exe程序[272]如何把Python脚本导出为exe程序

    文章目录:一. PyInstaller简介二. PyInstaller在Windows下的安装三. 打包四. 小实例(Windows下) 附加:pyinstaller简介 PyInstaller能够将Python脚本打包成可执行程序,使得在没有Python环境的机器上也可以运行这些程序。 PyIns…

    2026年9月23日 用户投稿
    100

发表回复

登录后才能评论
关注微信