python异步编程案例之事件循环

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

先定义一个协程函数

import asyncio

async def do_some_work(x):
    print("Hello:",x)
    return "work is done for {}".format(x)

拿到事件循环对象loop容器,将协程对象扔进事件循环对象中触发。

coroutine = do_some_work('test')
loop = asyncio.get_event_loop()
loop.run_until_complete(coroutine)

run_until_complete 是一个阻塞(blocking)调用,直到协程运行结束,它才返回。

Hello: test

实际项目中,往往有多个协程,同时在一个 loop 里运行。为了把多个协程交给 loop实现并发,需要借助 asyncio.gather 或者 asyncio.wait函数。

coroutines = []
for i in range(5):
    coroutines.append(do_some_work(i))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(coroutines))
# loop.run_until_complete(asyncio.gather(*coroutines))
Hello: 4
Hello: 0
Hello: 1
Hello: 2
Hello: 3

如何停止loop?
需要调用loop.stop(), 利用回调函数实现。

import asyncio
import functools

async def do_some_work(x):
    print("Hello:",x)
    return "work is done for {}".format(x)
    
def done_callback(loop, future):
    loop.stop()
    print("callback: ", future.result())
    
loop = asyncio.new_event_loop() # 创建一个新的loop对象
asyncio.set_event_loop(loop)
futus = asyncio.gather(do_some_work(1), do_some_work(2), do_some_work(3))
futus.add_done_callback(functools.partial(done_callback, loop))
loop.run_forever() #  在调用 stop() 之前将一直运行,restart loop
Hello: 1
Hello: 3
Hello: 2
callback:  ['work is done for 1', 'work is done for 2', 'work is done for 3']

彻底关闭loop
以上示例都没有调用 loop.close,好像也没有什么问题。所以到底要不要调 loop.close 呢?
简单来说,loop 只要不关闭,就还可以再运行。
继续运行以下代码。

loop.run_until_complete(do_some_work(4))
Hello: 4
Out[38]: 'work is done for 4'

但是如果关闭了,就不能再运行其他协程了。

loop.close()
loop.run_until_complete(do_some_work(5))
Traceback (most recent call last):
  File "D:\anaconda3\envs\tensor-flow\lib\site-packages\IPython\core\interactiveshell.py", line 3291, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-41-50fd63fec95a>", line 1, in <module>
    loop.run_until_complete(do_some_work(5))
  File "D:\anaconda3\envs\tensor-flow\lib\asyncio\base_events.py", line 460, in run_until_complete
    self._check_closed()
  File "D:\anaconda3\envs\tensor-flow\lib\asyncio\base_events.py", line 377, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

建议调用 loop.close,以彻底清理 loop 对象防止误用。

python】async异步编程 async异步编程 阅读详情

相关推荐

高并发神器:深入解析 Python Asyncio 事件循环调度原理

本文深入解析了Python Asyncio事件循环的调度原理,帮助开发者掌握异步编程的核心技术。文章首先介绍了事件循环的基本概念及其在异步任务调度、I/O操作管理中的作用,并通过代码示例展示了如何使用asyncio.get_event_loop()创建和运行事件循环。接着,详细探讨了Task与Future的任务调度机制,解释了如何通过asyncio.create_task()和Future.set_result()来管理和执行异步任务。

铭渊老黄 1347

Python之深入理解asyncio(三)

前言 这篇文章是《深入理解asyncio》的第三篇,主要包含回调,多线程和在asyncio中执行同步代码。 成功回调 可以给Task(Future)添加回调函数,等Task完成后就会自动调用这个(些)回调: 可以看到在任务完成后执行了callback函数。我这里顺便解释一个问题,不知道有没有人注意到。 为什么之前一直推荐大家用 asyncio.create_task,但是很多例子却用了 loop...

qq_42992919的博客 5737

126、异步编程:使用Python的asyncio提高效率

本文介绍了Python异步编程的概念和应用,重点讲解了asyncio库的使用。通过网络请求、文件读写和数据库操作的案例,展示了异步编程在提高效率方面的优势。同时,文章也提到了异步编程可能带来的复杂性和调试难度,并给出了注意事项。总体而言,异步编程是提升Python程序效率的有效方法,但需注意其带来的挑战。

silenceallat的博客 1279

pyshark报错,Error on reading from the event loop self pipe

在脚本最后一行补上,对FileCapture生成的对象cap进行关闭,cap.close(),就不会报错了。

amber_o0k的博客 1969

asyncio run_until_complete和run_forever运行对比

原因:run_until_complete和run_forever运行对比, run_until_complete 来运行 loop ,等到 future 完成,run_until_complete 也就返回了。 run_forever 会一直运行,直到 stop 被调用 第一种运行方式 # coding=utf-8 import asyncio import functools import l...

迷心兔的博客 2万+

python后台——asyncio,多进程+asyncio

今天我们来学习下异步io的服务器处理。

2万+

python异步编程案例之不同线程的事件循环

import asyncio from threading import Thread import time import threading now = lambda: time.time() def start_loop(loop): asyncio.set_event_loop(loop) loop.run_forever() def do_some_work(x): ...

HighDS的博客 683

Python协程与异步编程——asyncio

实现了。

Eric005的博客 1372

深入理解 Python 中的异步编程:从 asyncio 到异步 I/O

异步编程是一种编程模型,允许程序在执行某些耗时操作时不阻塞主线程,而是继续执行其他任务。与传统的同步编程相比,异步编程能够显著提高程序的效率,特别是在需要等待 I/O 操作(如网络请求、数据库操作、磁盘读取等)时。在同步编程中,程序必须等到某个操作完成后才能继续执行下一个操作,这样会导致 CPU 等待 I/O 完成而浪费时间。而在异步编程中,程序可以在等待 I/O 操作时切换到其他任务,提升程序的响应速度。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 2557

Python 异步编程

文章目录高性能异步编程一、 引入背景1、 概述2、 分析处理二、 终极处理方案三、 异步协程1、 协程2、 用法3、 实现协程3.1 greenlet3.2 yield3.3 asyncio3.4 async & await4、 协程的意义5、 异步编程5.1 事件循环5.2 快速上手5.3 await5.4 Task 对象5.5 Future 对象5.5.1 asyncio.Future 对象5.5.2 concurrent.future.Future 对象5.5.3 案例5.6 异步迭代器5

一个专注于机器学习基础与实战的技术博客,内容涵盖算法推导、模型实现、数学原理与代码实践。用通俗的语言解析复杂概念,记录学习过程中的思考与总结,适合机器学习爱好者和从业者参考。 6005

协程与异步编程

定义:协程(Coroutine)是一种用户态的上下文切换技术,通过单一线程实现代码块的切换执行,称为微线程。特点:在一个线程内,通过切换上下文实现多个任务的交替执行。例如,普通函数顺序输出1,2,3,4,协程可实现1,3,2,4。适用场景:主要用于IO密集型任务,提升效率。趋势:异步编程广泛应用于 Sanic、Tornado、Django 3.0 等框架,利用协程提升性能。优势:以更少资源处理更多任务,特别适合IO密集型场景。核心技术asyncio,结合uvloop可进一步优化性能。

2401_82416248的博客 1525

Python 异步编程的秘密武器:Asyncio

异步编程是一种编程范式,它允许程序在执行某些操作(如网络请求或文件读写)时,不会阻塞整个程序的运行。简单来说,当你在等某个任务完成时,你可以去做其他事情,而不是一味地等待。

GLB_0627的博客 727

Python Bug 修复案例分析:asyncio 事件循环异常引发的程序崩溃 两种修复方法

在使用Python的asyncio库进行异步编程时,正确管理事件循环是确保程序稳定运行的关键。本文通过一个网络爬虫程序的案例,分析了因事件循环管理不当导致的RuntimeError: This event loop is already running异常。问题的根源在于直接调用异步函数main(),而没有通过asyncio.run()来正确管理事件循环。修复方案有两种:一是使用asyncio.run(main())自动创建和管理事件循环;二是手动创建、设置和关闭事件循环。两种方法均能有效解决问题,但asy

mg668的博客 1067

Python 协程革命:深入理解 asyncio 的事件循环与高并发奥秘》

本文深入解析了Python asyncio框架的核心机制,包括协程、事件循环与任务三大组件。通过对比传统并发模型的不足,展示了asyncio在高并发I/O任务中的优势,并提供了异步爬虫实战案例。文章还探讨了最佳实践、常见问题解决方案,以及asyncio在FastAPI等现代Web框架中的应用。最后展望了异步编程的未来趋势,邀请读者分享实践经验。全文系统性地介绍了如何利用asyncio构建高效并发系统,适合希望提升Python异步编程能力的开发者阅读。

铭渊老黄 626

Python异步编程:利用异步编程提高性能

Python从3.4版本开始引入了asyncio库,这是一个用于编写异步应用程序的核心库。asyncio提供了一套完整的工具集,包括事件循环、协程、任务调度等,帮助开发者轻松地构建高性能的异步应用。通过asyncio,你可以编写出既简洁又高效的异步代码。

master_chenchen的博客 1106

探索 Python Asyncio 的核心:事件循环、Task、Future 与 Coroutine

本文深入解析 Python asyncio 异步编程框架的核心组件。首先介绍了事件循环(Event Loop)的工作机制,它是asyncio的调度中心,负责管理任务执行流程。其次详细讲解了Task和Future:Task作为协程的封装容器参与事件循环调度,Future则用于表示异步操作的结果。文章还阐述了协程(Coroutine)的基础作用,以及三者的层级关系:协程定义逻辑→Task包装调度→Future表示结果。最后通过高并发爬虫案例展示了asyncio的实际应用价值,并探讨了异步编程的优化方向。

铭渊老黄 6480
上一篇: python异步编程案例之Future和Task
下一篇: python异步编程案例之协程执行和停止
HighDS
博客等级 码龄7年 13粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值