跪求大神.....关于协程的基础问题....
我再学习协程的时候,发现写法不一样, 竟然一种生效,一种不生效.按下面的写法,协程不生效.总耗时4秒
import asyncio
import time
async def hello_ivan(delay,what):
await asyncio.sleep(delay)
print(what)
async def main():
print( f"开始时间:{time.strftime('%X')}")
awaitasyncio.create_task(hello_ivan(3,"ivan"))# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
awaitasyncio.create_task(hello_ivan(1,"lucy"))# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
print( f"结束时间:{time.strftime('%X')}")
asyncio.run(main())
但是按下面的写法, 协程就生效了,总耗时3秒,好诡异啊 ..................求大神告知一下原因, 他们说上面的不会同步执行, 但是明明2种写法一样啊.
import asyncio
import time
async def hello_ivan(delay,what):
await asyncio.sleep(delay)
print(what)
async def main():
task1 = asyncio.create_task(hello_ivan(3,"ivan"))
task2 = asyncio.create_task(hello_ivan(1,"lucy"))
print( f"开始时间:{time.strftime('%X')}")
awaittask1# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
awaittask2# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
print( f"结束时间:{time.strftime('%X')}")
asyncio.run(main())# 耗时3秒 你的第一个代码的等价代码应该是这样的:
import asyncio
import time
async def hello_ivan(delay,what):
await asyncio.sleep(delay)
print(what)
async def main():
print( f"开始时间:{time.strftime('%X')}")
task1 = asyncio.create_task(hello_ivan(3,"ivan"))
awaittask1# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
task2 = asyncio.create_task(hello_ivan(1,"lucy"))
awaittask2# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
print( f"结束时间:{time.strftime('%X')}")
asyncio.run(main())# 耗时3秒
你的那两种写法是不一样的,你的第二种写法在 await 之前所有 task 已经被创建完成,而第一种写法是创建一个 task 就 await 一个
你的那两种写法就相当于:
“你已经把所有任务打安排好了,剩下的就交给每个工人去完成了(那所有任务完成的时间就是完成最慢的那个的时间)”
与
“你要等工人完成上一个任务才开始安排下一个任务(那所有任务的完成时间就是每一个任务的完成时间之和)”
isdkz 发表于 2023-9-17 22:13
你的第一个代码的等价代码应该是这样的:
亲, 不一样哦,我第一个案例, 实际耗时4秒了, 第改写我的第一个案例,耗时是3秒.你改写的实际上是第二个案例了. 从入门到富豪 发表于 2023-9-18 20:36
亲, 不一样哦,我第一个案例, 实际耗时4秒了, 第改写我的第一个案例,耗时是3秒.你改写的实际上是第二 ...
我改写的那个耗时就是4秒的,你是不是看错了?你把那个1秒也改成3秒就知道了,因为1秒之差不好看出来 isdkz 发表于 2023-9-18 21:58
我改写的那个耗时就是4秒的,你是不是看错了?你把那个1秒也改成3秒就知道了,因为1秒之差不好看出来
主要想弄清楚那个4秒的, 为什么是4秒. 从入门到富豪 发表于 2023-9-19 11:51
主要想弄清楚那个4秒的, 为什么是4秒.
我那上面不是给你说了吗?你又说我改写的是第二个代码
你把延迟调大一点不就知道了,你看看和第二个代码的区别,以及2楼的解释
import asyncio
import time
async def hello_ivan(delay,what):
await asyncio.sleep(delay)
print(what)
async def main():
print( f"开始时间:{time.strftime('%X')}")
task1 = asyncio.create_task(hello_ivan(3,"ivan"))
awaittask1# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
task2 = asyncio.create_task(hello_ivan(3,"lucy")) # 这里延迟调大
awaittask2# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
print( f"结束时间:{time.strftime('%X')}")
asyncio.run(main())# 耗时3秒
isdkz 发表于 2023-9-19 12:32
我那上面不是给你说了吗?你又说我改写的是第二个代码
你把延迟调大一点不就知道了,你看看和第二个 ...
我知道是什么情况了你这个写法,其实就是我上面3秒的写法,真实的原因就是任务建立的对象不一样了, await 后面再建立任务,相当于新启了一个event loop, 会先执行完这个循环,才会执行下一个循环.
页:
[1]