首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步函数内部的python异步函数

异步函数内部的python异步函数
EN

Stack Overflow用户
提问于 2021-04-23 17:34:08
回答 2查看 109关注 0票数 3

我的代码:

代码语言:javascript
复制
import asyncio
from random import randrange

async def inner_sleep(letter, num):
    print(f'start inner sleep {letter}, {num}')
    myint = randrange(5)
    await asyncio.sleep(myint)
    print(f'done with inner sleep {letter}, {num}')

async def outer_sleep(letter):
    print(f'start outer sleep {letter}')
    myint = randrange(5)
    await asyncio.sleep(myint)
    print(f'done with outer sleep {letter}')

async def inside(letter):
    nums = [1,2,3,4,5,6]
    tasks = []

    async def create_task(num):
        task = asyncio.ensure_future(inner_sleep(letter, num))
        tasks.append(task)
    
    for num in nums:
        await create_task(num)

    await asyncio.gather(*tasks)


async def outside():

    letters = ['a','b','c','d']
    tasks = []

    async def create_task_1(letter):
        task = asyncio.ensure_future(outer_sleep(letter))
        tasks.append(task)

    for letter in letters:
        await create_task_1(letter)
        await inside(letter)
    
    await asyncio.gather(*tasks)

asyncio.run(outside())

示例输出:

代码语言:javascript
复制
start outer sleep a
start inner sleep a, 1
start inner sleep a, 2
start inner sleep a, 3
start inner sleep a, 4
start inner sleep a, 5
start inner sleep a, 6
done with inner sleep a, 4
done with outer sleep a
done with inner sleep a, 2
done with inner sleep a, 3
done with inner sleep a, 1
done with inner sleep a, 5
done with inner sleep a, 6
start outer sleep b
start inner sleep b, 1
start inner sleep b, 2
start inner sleep b, 3
start inner sleep b, 4
start inner sleep b, 5
start inner sleep b, 6
done with inner sleep b, 3
done with inner sleep b, 5
done with inner sleep b, 4
done with outer sleep b
done with inner sleep b, 1
done with inner sleep b, 6
done with inner sleep b, 2
start outer sleep c
start inner sleep c, 1

我在一个循环中有一个循环,我希望它们都异步运行。内部的工作正常,但我无法让外部的去做我想做的事情。在上面的代码中,我想让我的外部函数同时循环“letters”列表。对于每个字母,我需要在第二个函数(inner_sleep)开始之前完成第一个函数(outer_sleep)。我似乎找不到一个地方来放置内部函数来实现这一点。当我运行这段代码时,你可以在结果中看到‘内部睡眠a’是如何在‘完成外部睡眠a’之前开始的。理想情况下,我的输出应该如下所示:

代码语言:javascript
复制
start outer sleep a
start outer sleep b
finish outer sleep a
start inner sleep a, 1
start inner sleep a, 2
start inner sleep a, 3
start inner sleep a, 4
start inner sleep a, 5
start inner sleep a, 6
finish outer sleep b
start inner sleep b, 1
start inner sleep b, 2
start inner sleep b, 3
start inner sleep b, 4
start inner sleep b, 5
start inner sleep b, 6
done with inner sleep a, 4
done with inner sleep a, 2
done with inner sleep b, 3

这个是可能的吗?

EN

回答 2

Stack Overflow用户

发布于 2021-04-23 17:47:54

create_task_1中,您调用了outer_sleep,但没有对结果执行await操作。这意味着任务已启动,但outside函数的执行仍未完成。

有没有需要create_task_1函数的原因?你能直接用await outer_sleep(letter)代替吗?例如(请注意,这是未经测试的):

代码语言:javascript
复制
async def outside():

    letters = ['a','b','c','d']
    
    # don't need create_task_1 funciton anymore

    for letter in letters:
        await outer_sleep(letter)
        await inside(letter)
    
    # don't need to gather the tasks as they're already complete

编辑

您在注释中阐明了您希望所有outer_sleep任务同时启动。你只需要稍微改变一下执行的顺序

代码语言:javascript
复制
async def outside():

    letters = ['a','b','c','d']
    tasks = []

    async def task_1(letter):
        await outer_sleep(letter)
        await inside(letter)

    for letter in letters:
        task = asyncio.ensure_future(task_1(letter))
        tasks.append(task)
    
    await asyncio.gather(*tasks)
票数 0
EN

Stack Overflow用户

发布于 2021-04-29 08:20:41

如果只是把await inside(letter)放在outer_sleep的末尾呢?这确保了它只会在该特定outer_sleep的结果到达时运行。

代码语言:javascript
复制
import asyncio
from random import randrange


async def inner_sleep(letter, num):
    print(f'start inner sleep {letter}, {num}')
    myint = randrange(5)
    await asyncio.sleep(myint)
    print(f'done with inner sleep {letter}, {num}')


async def inside(letter):
    nums = [1, 2, 3, 4, 5, 6]
    tasks = [asyncio.ensure_future(inner_sleep(letter, num)) for num in nums]
    await asyncio.gather(*tasks)


async def outer_sleep(letter):
    print(f'start outer sleep {letter}')
    myint = randrange(5)
    await asyncio.sleep(myint)
    print(f'done with outer sleep {letter}')
    await inside(letter)


async def outside():
    letters = ['a', 'b', 'c', 'd']
    tasks = [asyncio.ensure_future(outer_sleep(letter)) for letter in letters]
    await asyncio.gather(*tasks)


asyncio.run(outside())

asyncio.gather意味着数字和字母都可以按任何顺序处理(例如,“c”可以在“b”之前),如果你同意的话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67227498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档