asyncio异步的基础理解

本文通过实例探讨了对asyncio异步编程的错误理解与正确概念,指出只有当eventloop中有两个以上协程时才能实现真正的异步。文中提到在asyncio.sleep(5)执行期间,由于缺少其他task,导致控制权无法切换,从而表现为同步行为。最后提出了如何查看eventloop中任务的疑问。
摘要由CSDN通过智能技术生成

大概半年前开始使用asyncio。最初开始接触asyncio是受到“车主”的影响,因为他说他的项目基本都是使用的aio的方式,例如aioredis,aiokafka,aiomysql等。
但是之前对asyncio的用法一直有误解,就连之前写的异步消费埋点数据的项目看似用了async的语法,但实际上并没有真正的实现异步。下面通过最基本简单的例子来纠正之前理解上的错误:

import asyncio


async def main():
    print('Hello ...')
    await asyncio.sleep(5)
    print('... World!')


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
错误的理解:

既然是异步的运行,那这里其实有两个协程,一个是main(),一个是asyncio.sleep(5)。当asyncio.sleep(5)在执行的时候控制权应该交回给main(),所以print(’… World!’)应该在sleep之前打印出来。
但实际上在执行的时候发现print(’… World!’)并没有立刻被打印,而是在等待了5s之后才被打印出来。这里看上去有多个协程,而且asyncio.run的使用方法也没错,为什么并没有实现真正的异步呢?

正确的理解:

参考了stack overflow上的解释&#x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值