鱼C论坛

 找回密码
 立即注册
查看: 2315|回复: 9

[已解决]关于协程的基础问题

[复制链接]
发表于 2021-3-7 11:17:19 | 显示全部楼层 |阅读模式

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

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

x
task是用来创建任务的,gather是用来并发的, 这2个的功能我很迷糊, 因为我不创建任务,也能用gather来并发
那么 创建任务task的意义何在呢?  是不是用gather就可以完全抛弃task了。求大神指点。

import asyncio
import time
async def ceshi01(x,y):

    await asyncio.sleep(y)
    print(f"我是{x},我运行了{y}分钟")


async def yunxing():

    # await asyncio.gather(ceshi01('A',2),ceshi01('b',3),ceshi01('c',4))   #用这个也能运行


    await asyncio.create_task(ceshi01('A',2))   #用这个也能运行
    # asyncio.create_task(ceshi01('b',3))
    # asyncio.create_task(ceshi01('c',4))
   

print(asyncio.run(yunxing()))
最佳答案
2021-3-9 15:20:10
从入门到富豪 发表于 2021-3-9 10:24
非常感谢,我大概明白了,也就是说gather是tasks里面的方法。那我们平时使用多线程,
是不是可以不用任 ...
import asyncio
import time
async def ceshi01(x,y):
    await asyncio.sleep(y)
    print(f"我是{x},我运行了{y}分钟")

async def yunxing():
    group_a = asyncio.gather(ceshi01('A',5),ceshi01('a',3))
    group_b = asyncio.gather(ceshi01('b',4),ceshi01('B',2))
    await group_a
    await group_b

print(asyncio.run(yunxing()))
import asyncio
import time
async def ceshi01(x,y):
    await asyncio.sleep(y)
    print(f"我是{x},我运行了{y}分钟")

async def yunxing():
    await  asyncio.gather(ceshi01('A',5),ceshi01('a',3))
    await  asyncio.gather(ceshi01('b',4),ceshi01('B',2))

print(asyncio.run(yunxing()))
你觉得是是一样的吗  一样的你就完全没懂create_task做了什么  要是懂了你就可以自己写一个gather函数 哪怕不保序也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-7 12:16:49 | 显示全部楼层
也就是说 task可以直接异步执行,  用gather也能异步执行。
现在先用task封装一下,然后也可以用gather执行,  这到底有啥区别啊。 我的天啊。 求助啊!!
import asyncio
import time
async def ceshi01(x,y):

    await asyncio.sleep(y)
    print(f"我是{x},我运行了{y}分钟")

async def yunxing():
    start = time.perf_counter()

    task = asyncio.create_task(ceshi01('b',3))  # 也可以像这样创建了任务
    task1 = asyncio.create_task(ceshi01('c',4))
    await asyncio.gather(task,task1)    #再用gather 来执行的情况,  
    print(time.perf_counter() - start)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-8 16:48:29 | 显示全部楼层
asyncio.gather() 其实有返回值 返回的依然是task
task和task1注册为了一个task
然后再await
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-8 16:49:17 | 显示全部楼层
import asyncio
import time
async def ceshi01(x,y):
    await asyncio.sleep(y)
    print(f"我是{x},我运行了{y}分钟")

async def yunxing():
    group_a = asyncio.gather(ceshi01('A',5),ceshi01('a',3))
    group_b = asyncio.gather(ceshi01('b',4),ceshi01('B',2))
    await group_a
    await group_b

print(asyncio.run(yunxing()))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-9 10:24:03 | 显示全部楼层

非常感谢,我大概明白了,也就是说gather是tasks里面的方法。那我们平时使用多线程,
是不是可以不用任务task封装,而是直接使用gather呢?

因为我发现3种写法都可以,1.直接用task封装协程,然后调用执行。
2.可以不用task封装,直接用gather并发执行。
3.可以用task封装后,再用gather并发执行。   哪一种更好呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-9 10:28:23 | 显示全部楼层
kogawananari 发表于 2021-3-8 16:48
asyncio.gather() 其实有返回值 返回的依然是task
task和task1注册为了一个task
然后再await

gather()的返回值是列表哦,   task的返回值是task类型。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 15:05:48 | 显示全部楼层
从入门到富豪 发表于 2021-3-9 10:28
gather()的返回值是列表哦,   task的返回值是task类型。

你能await它的返回值  怎么可能是列表

你能await list()吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 15:08:55 | 显示全部楼层
从入门到富豪 发表于 2021-3-9 10:24
非常感谢,我大概明白了,也就是说gather是tasks里面的方法。那我们平时使用多线程,
是不是可以不用任 ...

task和gather都是封装协程  不管执行的  你用不用gather都是并发 只是gather封装之后可以保留原始顺序方便罢了

你执行全靠的asyncio.run
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 15:20:10 | 显示全部楼层    本楼为最佳答案   
从入门到富豪 发表于 2021-3-9 10:24
非常感谢,我大概明白了,也就是说gather是tasks里面的方法。那我们平时使用多线程,
是不是可以不用任 ...
import asyncio
import time
async def ceshi01(x,y):
    await asyncio.sleep(y)
    print(f"我是{x},我运行了{y}分钟")

async def yunxing():
    group_a = asyncio.gather(ceshi01('A',5),ceshi01('a',3))
    group_b = asyncio.gather(ceshi01('b',4),ceshi01('B',2))
    await group_a
    await group_b

print(asyncio.run(yunxing()))
import asyncio
import time
async def ceshi01(x,y):
    await asyncio.sleep(y)
    print(f"我是{x},我运行了{y}分钟")

async def yunxing():
    await  asyncio.gather(ceshi01('A',5),ceshi01('a',3))
    await  asyncio.gather(ceshi01('b',4),ceshi01('B',2))

print(asyncio.run(yunxing()))
你觉得是是一样的吗  一样的你就完全没懂create_task做了什么  要是懂了你就可以自己写一个gather函数 哪怕不保序也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-31 09:55:30 | 显示全部楼层
kogawananari 发表于 2021-3-9 15:20


你觉得是是一样的吗  一样的你就完全没懂create_task做了什么  要是懂了你就可以自己写一个gathe ...

大佬啊, 我现在学了几遍基础了,这2个看起来还是一样的啊, 能告诉我这2个有啥不一样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 21:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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