异步任务取消。是同步的吗?

asyncio task cancel. Is is synchronous?

我了解到task.cancel()在任务函数中安排了一个异常抛出。这是同步发生的吗? (因为我不等待 task.cancel())。 task.cancel() 行后面的代码是否可以假定任务将不再 运行?

一个简单的例子:

async def task1():
    await asyncio.sleep(3)
    print("after sleep")

async def task2():
    t = loop.create_task(task1())
    await asyncio.sleep(1)
    t.cancel()
    # can the following code lines assume that task1 is no longer running?

loop = asyncio.get_event_loop()
loop.run_forever()

Can code that follows the line task.cancel() assume that the task will no longer run?

没有。 task.cancel() 只标记稍后要取消的任务。您应该在它之后显式等待任务并捕获 CancelledError 以确保任务被取消。

参见