从入门到富豪 发表于 2023-9-17 21:37:05

跪求大神.....关于协程的基础问题....

我再学习协程的时候,发现写法不一样, 竟然一种生效,一种不生效.
按下面的写法,协程不生效.总耗时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秒

isdkz 发表于 2023-9-17 22:13:24

你的第一个代码的等价代码应该是这样的:

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 一个

你的那两种写法就相当于:

“你已经把所有任务打安排好了,剩下的就交给每个工人去完成了(那所有任务完成的时间就是完成最慢的那个的时间)”



“你要等工人完成上一个任务才开始安排下一个任务(那所有任务的完成时间就是每一个任务的完成时间之和)”

从入门到富豪 发表于 2023-9-18 20:36:28

isdkz 发表于 2023-9-17 22:13
你的第一个代码的等价代码应该是这样的:




亲, 不一样哦,我第一个案例, 实际耗时4秒了, 第改写我的第一个案例,耗时是3秒.你改写的实际上是第二个案例了.

isdkz 发表于 2023-9-18 21:58:20

从入门到富豪 发表于 2023-9-18 20:36
亲, 不一样哦,我第一个案例, 实际耗时4秒了, 第改写我的第一个案例,耗时是3秒.你改写的实际上是第二 ...

我改写的那个耗时就是4秒的,你是不是看错了?你把那个1秒也改成3秒就知道了,因为1秒之差不好看出来

从入门到富豪 发表于 2023-9-19 11:51:36

isdkz 发表于 2023-9-18 21:58
我改写的那个耗时就是4秒的,你是不是看错了?你把那个1秒也改成3秒就知道了,因为1秒之差不好看出来

主要想弄清楚那个4秒的, 为什么是4秒.

isdkz 发表于 2023-9-19 12:32:06

从入门到富豪 发表于 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秒

从入门到富豪 发表于 2023-9-19 15:12:18

isdkz 发表于 2023-9-19 12:32
我那上面不是给你说了吗?你又说我改写的是第二个代码

你把延迟调大一点不就知道了,你看看和第二个 ...

我知道是什么情况了你这个写法,其实就是我上面3秒的写法,真实的原因就是任务建立的对象不一样了, await 后面再建立任务,相当于新启了一个event loop, 会先执行完这个循环,才会执行下一个循环.
页: [1]
查看完整版本: 跪求大神.....关于协程的基础问题....