当前位置:

首页 > 编程开发 > Python异步编程解析:asyncio事件循环详解

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异步编程的核心机制,负责调度和运行协程。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 或某些嵌入式环境中,可能需要手动获取或创建事件循环。

    例如:

    import asyncio
    
    async 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 t2
    
    asyncio.run(main())

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

    关键点在于:

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

    常见问题与注意事项

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

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

    避免阻塞主线程

    如果你在事件循环中执行同步阻塞操作(如长时间计算、普通 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 threading
    
    def thread_main():
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(main())
    
    threading.Thread(target=thread_main).start()

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


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

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    Python异步编程:asyncio入门详解
    Python异步编程:asyncio入门详解

    Python实现异步编程主要依靠asyncio模块,其核心在于理解事件循环、协程和async/await语法。1.asyncio是Python标准库中用于编写异步代码的核心工具,通过事件循环调度协程,使程序在等待I/O操作时不阻塞主线程。2.异步函数用asyncdef定义,内部使用await等待其他异步操作完成,从而实现非阻塞并发。3.asyncio.run()是启动异步主函数的推荐方式,它自动创建并关闭事件循环。4.要并发运行多个任务,可以使用asyncio.create_task()或asyncio.

    Python协程是什么?asyncio实现方法详解
    Python协程是什么?asyncio实现方法详解

    协程是一种比线程更轻量级的并发方式,基于生成器或async/await语法实现,通过主动让出CPU控制权提升程序效率。1.Asyncio是Python中基于协程的并发库,使用事件循环调度任务;2.协程由程序自身调度,资源消耗小,避免了锁和死锁问题;3.避免阻塞操作需使用异步I/O库如aiohttp或放到独立线程执行;4.异常处理可通过try...except捕获,或使用asyncio.gather配合return_exceptions=True参数;5.调试可通过启用调试模式、添加日志、使用调试器或第三方

    Golang协程与 asyncio
    Golang协程与 asyncio

    Golang协程和Pythonasyncio都是并发编程工具。协程是轻量级线程,在同一线程并发运行;asyncio使用事件循环处理I/O事件。Golang协程语法简洁,性能优于asyncio,适合密集型计算;asyncio异步特性适合处理大量I/O事件,语法更易用,适合Python开发者。根据应用程序需求和开发者偏好选择最合适的技术尤为重要。

    揭开 Python asyncio 的秘密:发现真正的并发性
    揭开 Python asyncio 的秘密:发现真正的并发性

    并发性与传统的阻塞式编程在传统的阻塞式编程中,当一个任务等待I/O操作(例如读取文件或网络请求)时,整个程序会被阻塞,直到该操作完成。这会限制应用程序的效率,特别是当处理大量I/O密集型操作时。asyncio的事件循环asyncio引入了事件循环的概念,该循环不断监视各种I/O事件。当检测到事件时,事件循环会将适当的回调函数放到事件队列中。这些回调函数被称为协程,它们代表着可以挂起的任务。协程和异步编程协程是asyncio的核心概念。它们是轻量级的、可暂停和恢复的任务。与线程不同,协程在同一线程中执行,避

    探究 asyncio 的潜力:实现无缝的并发操作
    探究 asyncio 的潜力:实现无缝的并发操作

    异步编程的本质传统同步编程模型会阻塞应用程序的执行流,直到某个操作完成。这在处理I/O密集型任务时效率低下,因为应用程序必须等待这些操作完成,从而导致延迟和资源浪费。异步编程是通过使用协程来克服此限制。协程是轻量级的、可随时暂停和恢复的函数。当一个协程遇到一个阻塞操作(如网络请求)时,它可以暂停执行,让应用程序处理其他任务。当阻塞操作完成时,协程可以恢复执行,继续从中断处进行。asyncio库asyncio是python的一个异步编程库,它提供了一组全面的工具,用于编写高性能、并发的应用程序。它基于协程和

    提升你的 Python asyncio 技能:从入门到精通
    提升你的 Python asyncio 技能:从入门到精通

    并发和异步编程并发编程处理同时执行的多个任务,异步编程是一种并发编程,其中任务不会阻塞线程。asyncio是python中用于异步编程的库,它允许程序在不阻塞主线程的情况下执行I/O操作。事件循环asyncio的核心是事件循环,它监控I/O事件并调度相应的任务。当一个协程准备就绪时,事件循环会执行它,直到它等待I/O操作。然后,它会暂停协程并继续执行其他协程。协程协程是可暂停和恢复执行的函数。asyncdef关键字用于创建协程。协程使用await关键字等待I/O操作完成。asyncio的基础以下代码演示了

    GIL的解剖:应对和克服并发问题
    GIL的解剖:应对和克服并发问题

    python的全局解释器锁(GIL)是一种同步机制,它确保Python解释器一次只能执行一个线程。这有助于防止数据竞争和保证线程安全性,但也会限制并行计算的性能,尤其是在多核系统中。GIL的作用GIL的作用是防止多个线程同时访问共享数据,从而导致竞争条件。它通过在每次执行字节码时获取锁来实现这一点。当一个线程获取GIL时,其他线程将被阻塞,直到锁被释放。GIL的缺点虽然GIL提供了线程安全,但它也对多线程Python程序的性能产生了负面影响。由于GIL限制了并行执行,因此在多核系统上无法充分利用所有可用的

    Python并发编程: 探索提升效率的异步代码技巧
    Python并发编程: 探索提升效率的异步代码技巧

    1.为什么要使用异步编程?传统编程使用阻塞式I/O,这意味着程序会等待某个操作完成,然后才能继续执行。这对于处理单个任务来说可能很有效,但对于处理大量任务时,可能会导致程序变慢。异步编程则打破了传统阻塞式I/O的限制,它使用非阻塞式I/O,这意味着程序可以将任务分发到不同的线程或事件循环中执行,而无需等待任务完成。这允许程序同时处理多个任务,提高程序的性能和效率。2.python异步编程的基础Python异步编程的基础是协程和事件循环。协程是允许函数在暂停和恢复之间切换的函数。事件循环则负责调度协程,使它

    揭秘Python异步编程: 从入门到掌握
    揭秘Python异步编程: 从入门到掌握

    什么是异步编程?异步编程是一种编程范式,它允许程序在不阻塞的情况下并发执行多个任务。与传统的同步编程不同,异步编程中,当一个任务需要等待其他任务完成时,它不会被阻塞,而是可以继续执行其他任务。这样,程序可以同时处理多个任务,从而提高程序的整体性能。python中的异步编程Python3.4及更高版本支持异步编程。异步编程在Python中主要通过协程和asyncio模块来实现。协程是Python中一种特殊的函数,它允许程序在不阻塞的情况下暂停和恢复执行。asyncio模块是Python中的一个异步编程框架,

    掌握Python异步编程,提高程序效率
    掌握Python异步编程,提高程序效率

    异步编程基础异步编程是一种编程范式,它允许程序在等待I/O操作(如网络请求、文件读写等)时执行其他任务,从而提高程序的吞吐量和响应速度。在传统的同步编程中,程序需要等待I/O操作完成才能继续执行。这会导致程序在等待I/O操作时出现阻塞,从而降低程序的性能。在异步编程中,程序可以将I/O操作交给一个事件循环(eventloop)来处理,然后继续执行其他任务。当I/O操作完成时,事件循环会通知程序,程序再进行相应的处理即可。协程协程(coroutine)是异步编程中的基本概念,它是一种可以暂停和恢复执行的函数

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。