首次完成后取消两个异步协同程序



我正在用Python制作一个Discord机器人。在某一点上,我想做的是等待两个协程,一旦第一个协程完成,就运行其余的代码,但取消剩余的协程(不像这里我只有一个协程并希望在特定时间后取消它。(

以下是可重复性最小的示例:

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_fo,因为有两个协程而不是一个,这两个协程都必须同时运行,直到其中一个完成。既然asyncio.wait在协程完成后不会取消协程,有什么方法可以取消它们吗?

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

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

最新更新