异步。任务cancel() 如果任务不在事件循环中,则不会取消任务 [duplicate]

asyncio.Task cancel() does not cancel the task if it's not in event loop [duplicate]

提问人:winwin 提问时间:11/13/2023 更新时间:11/13/2023 访问量:23

问:

我偶然发现了 Python 的一个相当违反直觉的行为。版本是 3.10.12,Ubuntu 22.04。

请考虑以下脚本:

import asyncio


async def main():
    t = asyncio.create_task(asyncio.sleep(5))
    t.cancel()
    print(t.cancelled())
    await asyncio.sleep(0)
    print(t.cancelled())


if __name__ == "__main__":
    asyncio.run(main())

它写道:

False
True

不应该写吗

True
True

相反?

我假设任务必须首先提交到事件循环,然后才能取消。但这真的不是一个错误吗?无论如何,我都不应该取消任务吗?

python async-await 任务 python-asyncio

评论

1赞 mkrieger1 11/13/2023
“cancelled():如果任务被取消,则返回 True。当使用 cancel() 请求取消并且包装的协程传播了抛入其中的 CancelledError 异常时,任务将被取消。
0赞 winwin 11/13/2023
@mkrieger1我抓住了你,谢谢

答: 暂无答案