我正在用Python制作一个不和谐的机器人。我想要做的是等待两个协程,一旦第一个完成,运行其余的代码,但取消剩余的协程(不像here,我只有一个协程,并希望它在特定的时间后被取消)。
下面是可重现的最小示例:
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不会在完成后取消协程,那么有什么方法可以取消它们吗?
发布于 2020-09-25 09:40:51
如果您将协程包装在任务中,则可以取消尚未完成的协程
@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()https://stackoverflow.com/questions/64056283
复制相似问题