从入门到富豪 发表于 2021-3-7 11:17:19

关于协程的基础问题

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-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)

kogawananari 发表于 2021-3-8 16:48:29

asyncio.gather() 其实有返回值 返回的依然是task
task和task1注册为了一个task
然后再await

kogawananari 发表于 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()))

从入门到富豪 发表于 2021-3-9 10:24:03

kogawananari 发表于 2021-3-8 16:49


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

因为我发现3种写法都可以,1.直接用task封装协程,然后调用执行。
2.可以不用task封装,直接用gather并发执行。
3.可以用task封装后,再用gather并发执行。   哪一种更好呢?

从入门到富豪 发表于 2021-3-9 10:28:23

kogawananari 发表于 2021-3-8 16:48
asyncio.gather() 其实有返回值 返回的依然是task
task和task1注册为了一个task
然后再await

gather()的返回值是列表哦,   task的返回值是task类型。

kogawananari 发表于 2021-3-9 15:05:48

从入门到富豪 发表于 2021-3-9 10:28
gather()的返回值是列表哦,   task的返回值是task类型。

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

你能await list()吗{:10_292:}

kogawananari 发表于 2021-3-9 15:08:55

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

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

你执行全靠的asyncio.run{:10_292:}

kogawananari 发表于 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():
    awaitasyncio.gather(ceshi01('A',5),ceshi01('a',3))
    awaitasyncio.gather(ceshi01('b',4),ceshi01('B',2))

print(asyncio.run(yunxing()))

你觉得是是一样的吗一样的你就完全没懂create_task做了什么要是懂了你就可以自己写一个gather函数 哪怕不保序也可以

从入门到富豪 发表于 2021-10-31 09:55:30

kogawananari 发表于 2021-3-9 15:20


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

大佬啊, 我现在学了几遍基础了,这2个看起来还是一样的啊, 能告诉我这2个有啥不一样吗?{:5_100:}
页: [1]
查看完整版本: 关于协程的基础问题