问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python中的asyncio使用详解与异步协程的处理流程分析

发布网友 发布时间:2024-10-04 16:06

我来回答

1个回答

热心网友 时间:2024-10-24 07:48

一些核心概念

异步函数的定义

普通函数通过使用 def 关键词定义,而异步函数,即协程函数 (Coroutine) 是一种特殊类型的函数,可以在代码块中将执行权交予其他协程。定义时使用 async def 关键词。

如何调用协程并获得结果

调用普通函数如 result = add2(2) 可直接运行并返回结果4。然而,调用 result = add3(2) 会返回一个协程对象,而非结果2+3=5。要获得结果,需将协程放置于事件循环中执行。

事件循环 Eventloop

Eventloop 是 asyncio 应用的核心,它注册并循环执行异步函数。在执行过程中,遇到需要等待的 I/O 操作(如网络请求)时会暂停执行,切换到其他函数。这使得多个异步函数可以协同运行。

得到协程执行结果

要得到协程函数的结果,必须先创建一个 Eventloop 或者在调用协程时使用 await 关键字。例如,result = await add3(2)。await 只能在协程函数中使用。

复杂协程执行示例

通过将两个协程放在 main 函数中,事件循环会按顺序执行它们,即便两个协程内部有不同等待时间。要使协程并行执行,需要使用 asyncio.gather() 函数。

使用 asyncio.gather() 和 Task 任务对象

通过 asyncio.gather() 可以并行执行多个协程函数,返回结果是一个列表。使用 Task 对象如 asyncio.ensure_future() 或 loop.create_task() 可动态添加协程到事件循环。

异步函数与同步函数的执行

创建 task 对象并使用 loop.run_until_complete() 可以运行协程函数。同时,可以为 task 对象添加回调方法,当协程执行结束时调用事件循环的 stop 方法来结束整个循环。

并行执行多个协程

使用 asyncio.gather() 函数可以轻松并行执行多个协程,并通过调用 await asyncio.gather(*) 获取所有结果。

异步与多线程的结合

在事件循环中动态添加同步函数可以通过子线程运行事件循环并使用 loop.call_soon_threadsafe() 方法添加函数。为了实现并发执行,可以使用 run_in_executor() 方法在执行器中执行同步函数。

执行器的选择

使用 concurrent.futures 下的 ThreadPoolExecutor 或 ProcessPoolExecutor 可在多线程或多进程中执行同步函数。注意它们在初始化时的 max_workers 参数决定执行器的工作线程数。

异步函数的动态添加

使用 asyncio.run_coroutine_threadsafe() 可以将协程绑定到事件循环上,避免阻塞主线程。通过 gather() 方法结合 run_coroutine_threadsafe() 和 run_in_executor() 获得多个协程的结果。

获取协程结果

使用 asyncio.gather() 可以并行获取多个协程的结果。注意,获取结果时协程所在的线程与主线程可能不同,这取决于事件循环的运行方式。

异步库与实践

总结了异步协程的基本概念与流程后,接下来可以进一步学习与实践如 aiohttp 等与异步相关的库与框架,深入理解异步编程的威力。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
好听简单的店铺名字店铺好听的名字大全 ...还脱皮。一年四季都这样,夏天能好一点,冬天严重时怎么回事啊?应该怎 ... 手,脚一年四季脱皮怎么办 地铁跑酷 地铁跑酷鼠小意会回归吗? 印度国家安全卫队身经百战 飞机驾驶室的机舱门在飞行时关闭么?为什么会有劫机成功的案例,不... 为什么中国不会劫机 急求翻译几个句子! 急求!!翻译句子!在线等! 我们和公婆住一起,大姑子每周末都过来耍 【Flutter 异步编程 - 2】 | 详细分析 Future 类的使用 DNF男魔法、鬼剑士、女神枪转什么职业好?还有要说出转职的角色都有什么... 和平精英变车按钮怎么调 没有证据欠钱不还怎么办最有效的方法 找几个同字不同音的词语,快点,急急急急急急急要,各路神仙都来帮帮忙 天津外国语大学算是全国211所大学还是985 ...花费、造作、差使、大意、冷战的意思,并造句。 天津外国语大学属于985吗? ...指甲边的肉发黄,晚上会一阵一阵的疼,该怎么办? 我的脚大拇指踢到了,指甲旁边流浓有点肿怎么办?穿鞋子的时候很疼,有... ...剪指甲后却依旧,轻轻侧压就会痛,现在再剪指甲却出血 s925是什么金多少钱 我把指甲剪到左脚的大拇指里了,现在肿起来了,很疼,红兮兮的,怎么办,前 ... 空腹血糖5.9如何 空腹血糖5.9是不是快得糖尿病了 2015中国农业银行安徽分行校园招聘考试笔试时间 笔试内容 ? 空腹血糖5.9是正常的吗 2015中国农行广东分行校园招聘职位表相关的信息? 血糖5.9正常吗要注意哪些 空腹血糖5.9严重吗 Rust的async与await的内部原理 【Spring Boot系列】如何利用@Async注解优雅的实现异步编程? Asyncio 异步编程模块-Python成为专业人士笔记 cad和天正软件有什么不同呢? 纸嫁衣5无间梦境第五章攻略 纸嫁衣5无间梦境第三章攻略 rust嵌入式开发之await 深入浅出Rust异步编程之Tokio c++多线程实践-async 怎样查看顾客到店次数? 为什么我的微信收款不能查看顾客到店次数? 77年硬币值12万 死神227集后继续虚圈 科目二考试流程,注意事项和细节 淘宝网上卖的苹果手机是真货吗 审计人员个人年度工作总结范本 ...西游记》《水浒传》《三国》中5个主要任务,总结5人的主要事迹... ...我怎么也投不了呢?还有在拼多多上怎么投运费险呢?谢谢回答... ...截了图,看不懂里面的意思,求哪位大触帮翻译下QAQ 屁股上长了个包很痛怎么回事 F2F彩妆是个怎样的牌子? 今天有活动要画大妆,朋友介绍了一个化妆的...