python 协程 如何不被取消

发布于 2022-09-11 23:03:28 字数 1190 浏览 19 评论 0

我开始学习python中的协程,学习到asyncio.shieldasyncio.wait_for这两个函数的时候有一个想法。

我想写一个函数,这个函数会因为超时而被asyncio.wait_for而取消,但是又会因这个函数asyncio.shield而不被取消。

import asyncio
import time


async def factorial(name, number):
    f = 1
    for i in range(2, number + 1):
        print(f"Task {name}: Compute factorial({i})...")
        await asyncio.sleep(1)
        f *= i
    print(f"Task {name}: factorial({number}) = {f}")


async def main():
    try:
        await asyncio.wait_for(
            asyncio.shield(
                factorial("func", 3)
            ), timeout=0
        )
    except asyncio.TimeoutError:
        print("Time out")


asyncio.run(main())
time.sleep(1)

发现并没有成功。
后面修改了一下,但是蒙了。

async def main():
    try:
        await asyncio.wait_for(
            asyncio.shield(
                factorial("func", 3)
            ), timeout=0
        )
    except asyncio.TimeoutError:
        print("Time out")
        await asyncio.sleep(10)

感觉是因为main函数的执行结束取消了。
但是最后一句await ... 改成time.sleep(10)又不行了。
求解释解释。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

何必那么矫情 2022-09-18 23:03:28

time.sleep会挂起整个线程(该例中也是整个进程),冻结事件循环(谁也别动)。
asyncio.sleep 并不是一回事,它是把控制交给主事件循环,自旋等待定时后,再向调度询问控制权。这样代码此处才有有可能切换到其他协程,形成异步。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文