asyncio.sleep()在Uvicorn和Starlette中等待时被取消,但在其他情况下可以正常工作。
创始人
2024-09-21 05:30:39
0

这是因为在Uvicorn和Starlette中,当一个HTTP请求被取消时,它会中断正在进行的所有协程。因此,在使用asyncio.sleep()等待时,如果请求被取消,协程将被中断,从而导致asyncio.sleep()立即停止并抛出CancelledError。

要解决这个问题,可以将asyncio.sleep()包装在try/except块中,以捕获CancelledError并返回。以下示例演示了如何包装asyncio.sleep()以使其在Uvicorn和Starlette中正常工作。

import asyncio
from starlette.applications import Starlette
from starlette.responses import JSONResponse


async def long_running_task():
    try:
        await asyncio.sleep(10)
        return {"status": "done"}
    except asyncio.CancelledError:
        return {"status": "cancelled"}


app = Starlette()


@app.route("/")
async def homepage(request):
    task = asyncio.ensure_future(long_running_task())

    while not task.done():
        await asyncio.sleep(0)

    return JSONResponse(task.result())

在上面的示例中,我们将asyncio.sleep()包装在try/except块中以捕获CancelledError,并返回“cancelled”状态。这将确保即使请求被取消,也不会中断协程并导致asyncio.sleep()被取消。

相关内容

热门资讯

透视辅助!红龙扑克辅助教程,红... 透视辅助!红龙扑克辅助教程,红龙扑克果然真的有挂(详细辅助工具教程);1、透视辅助简单,软件透明挂操...
透视辅助!AApoker都是存... 透视辅助!AApoker都是存在有挂,aapoker讲解确实真的有挂(详细辅助工具存在教程)1)辅助...
透视辅助!wpk德州代打是真的... 透视辅助!wpk德州代打是真的吗,(WPKplus)好像有挂(详细透视辅助教程)1、许多玩家不知道辅...
wepokeai机器人!wep... wepokeai机器人!wepoke辅助软件下载链接,(wepoke美元局)果然存在有挂(详细黑科技...
透视辅助!wpK辅助工具,wp... 透视辅助!wpK辅助工具,wpk安卓本来真的是有挂(详细有透视辅助教程);1、用户打开应用后不用登录...
我来教大家!德扑之星有挂总是,... 我来教大家!德扑之星有挂总是,德扑之星规律果然真的有挂(详细ai购买教程)1、快速入门:当你通过点击...
透视辅助!wPK好像真的是有挂... 透视辅助!wPK好像真的是有挂,wpk德州ai机器人其实真的是有挂(详细透视辅助教程)1、德州ai机...
程序员教你!德扑辅助技巧,德扑... 程序员教你!德扑辅助技巧,德扑之星入池率好像是有挂(详细记分牌教程)1、起透看视 透明视辅助2、随意...
玩家必看科普!!红龙扑克辅助工... 玩家必看科普!!红龙扑克辅助工具,红龙扑克确实有挂(详细辅助挂教程)是一款可以让一直输的玩家,快速成...
黑科技辅助挂!WEPOke总是... 黑科技辅助挂!WEPOke总是真的有挂,Wepoke最新版本来有挂(详细透明挂教程)1、ai辅助优化...