鱼C论坛

 找回密码
 立即注册
查看: 1248|回复: 6

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

[复制链接]
发表于 2023-9-17 21:37:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我再学习协程的时候,发现写法不一样, 竟然一种生效,一种不生效.  
按下面的写法,协程不生效.总耗时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')}"  )
    await  asyncio.create_task(hello_ivan(3,"ivan"))# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
    await  asyncio.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')}"  )
    await  task1# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
    await  task2# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
    print( f"结束时间:{time.strftime('%X')}"  )

asyncio.run(main())  # 耗时3秒

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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"))
    await  task1# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy

    task2 = asyncio.create_task(hello_ivan(1,"lucy"))
    await  task2# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
    print( f"结束时间:{time.strftime('%X')}"  )

asyncio.run(main())  # 耗时3秒

你的那两种写法是不一样的,你的第二种写法在 await 之前所有 task 已经被创建完成,而第一种写法是创建一个 task 就 await 一个

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

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



“你要等工人完成上一个任务才开始安排下一个任务(那所有任务的完成时间就是每一个任务的完成时间之和)”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-18 20:36:28 | 显示全部楼层
isdkz 发表于 2023-9-17 22:13
你的第一个代码的等价代码应该是这样的:

亲, 不一样哦,  我第一个案例, 实际耗时4秒了, 第改写我的第一个案例,耗时是3秒.  你改写的实际上是第二个案例了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-18 21:58:20 From FishC Mobile | 显示全部楼层
从入门到富豪 发表于 2023-9-18 20:36
亲, 不一样哦,  我第一个案例, 实际耗时4秒了, 第改写我的第一个案例,耗时是3秒.  你改写的实际上是第二 ...

我改写的那个耗时就是4秒的,你是不是看错了?你把那个1秒也改成3秒就知道了,因为1秒之差不好看出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-19 11:51:36 | 显示全部楼层
isdkz 发表于 2023-9-18 21:58
我改写的那个耗时就是4秒的,你是不是看错了?你把那个1秒也改成3秒就知道了,因为1秒之差不好看出来

主要想弄清楚那个4秒的, 为什么是4秒.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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"))                                 
    await  task1# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy

    task2 = asyncio.create_task(hello_ivan(3,"lucy"))                       # 这里延迟调大
    await  task2# 某个高io操作 正常情况下, 需要他执行完成,才会执行lucy
    print( f"结束时间:{time.strftime('%X')}"  )

asyncio.run(main())  # 耗时3秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-19 15:12:18 | 显示全部楼层
isdkz 发表于 2023-9-19 12:32
我那上面不是给你说了吗?你又说我改写的是第二个代码

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

我知道是什么情况了  你这个写法,其实就是我上面3秒的写法,  真实的原因就是任务建立的对象不一样了, await 后面再建立任务,相当于新启了一个event loop, 会先执行完这个循环,才会执行下一个循环.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-25 15:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表