首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第一次完成后,取消两个异步协程

第一次完成后,取消两个异步协程
EN

Stack Overflow用户
提问于 2020-09-25 08:47:50
回答 1查看 177关注 0票数 0

我正在用Python制作一个不和谐的机器人。我想要做的是等待两个协程,一旦第一个完成,运行其余的代码,但取消剩余的协程(不像here,我只有一个协程,并希望它在特定的时间后被取消)。

下面是可重现的最小示例:

代码语言:javascript
复制
import asyncio
import discord

client = discord.Client()

async def testfunc():
    await asyncio.sleep(10)
    print("10 seconds.")

async def testfunc2():
    await asyncio.sleep(15)
    print("15 seconds.")

@client.event
async def on_ready():
    print("Connected!")
    await asyncio.wait([testfunc(),testfunc2()],return_when=asyncio.FIRST_COMPLETED)

client.run('MY BOT TOKEN')

在这个最小的示例中,我打算让它打印"10秒“。10秒后,然后不再打印任何其他内容。但是,实际发生的情况是,它还输出"15秒“。15秒后,我想取消这个协程,这样就不会发生这种情况。

在这种情况下,我似乎不能使用asyncio.wait_for,因为有两个协程而不是一个,这两个协程必须同时运行,直到其中一个完成。既然asyncio.wait不会在完成后取消协程,那么有什么方法可以取消它们吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-25 09:40:51

如果您将协程包装在任务中,则可以取消尚未完成的协程

代码语言:javascript
复制
@client.event
async def on_ready():
    print("Connected!")
    tasks = [asyncio.create_task(testfunc()), asyncio.create_task(testfunc2())]
    await asyncio.wait(tasks,return_when=asyncio.FIRST_COMPLETED)
    for task in tasks:
        if not task.done():
            task.cancel()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64056283

复制
相关文章

相似问题

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