菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
240
0

gg

原创
05/13 14:22
阅读数 90995
大神你好,我是一个python小白,恕我刚接触计算机,您的一些回答我都不太明白。一个问题请教一下,我在学到异步io时,看到大神们包括您主流的观点是,当有io时,线程只给发起io系统调用,而系统会立即返回,这是线程就可以运行别的程序,等到系统接受到消息,再把这个主动返回给线程。那么既然asyncio就是异步模型,那么就应该符合异步的特点,我的理解是,一个携程 await 另一个io协程,如果用asyncio.sleep模拟io,那么执行到await asyncio.sleep(0.01)这一句,立马会切换到别的协程运行,而直到asyncio.sleep(0.01)结束,类比于网络io得到消息,在切换回原来的那个携程运行。然而事我测试了下并不是这样,asyncio.sleep(0.01)这个io在很短时间内就完成了,完成以后并没有立即切换回调用这个的携程运行。是我对异步的理解有误吗?
import asyncio
import time

 

大神你好,我是一个python小白,恕我刚接触计算机,您的一些回答对于我来说太深奥了我都不大能看懂。
一个问题请教一下,我在学到异步io时,看到大神们包括您主流的观点是,当有io时,线程只发起io系统调用,
而系统会立即返回,这时线程就可以运行别的程序,等到系统接受到消息,再把这个消息主动返回给线程。
那么既然asyncio就是异步模型,那么就应该符合异步的特点,我的理解是,一个携程 await另一个io协程,
如果用asyncio.sleep模拟io,那么执行到await asyncio.sleep(0.01)这一句,立马会切换到别的协程运行,
而直到asyncio.sleep(0.01)结束,类比于网络io得到消息,在切换回原来的那个携程运行。
然而事我测试了下并不是这样,asyncio.sleep(0.01)这个io在很短时间内就完成了,
完成以后并没有立即切换回调用这个的携程运行。是我对异步的理解有误吗?以下是执行代码
import asyncio,time
async def func():
    print("Hello world!")
    time.sleep(1)
    r = await asyncio.sleep(0.01)
    print(r)

loop = asyncio.get_event_loop()
funcs=[func() for i in range(200)]
tasks = asyncio.gather(funcs)
loop.run_until_complete(tasks)

#如果以我的推论,那么这段程序应该是在打印了两个Hello world以后立即打印None,因为第一个携程的asyncio.sleep(0.01)的这个模拟io操作已经运行结束了,就应该切换会这个携程里,从而打印None

 



发表评论

0/200
240 点赞
0 评论
收藏
为你推荐 换一批