aiohttp 后台运行任务

问题描述 投票:0回答:1

例如:

async def first_route(request):
    ......

async def second_route(request):
    ......
    
async def functionToSchedule():
    ......
    
if __name__ == '__main__':

    app = web.Application()
    app.router.add_get('/fr', first_route)
    app.router.add_post('/sr', second_route)
    web.run_app(app)

我无法理解,我如何添加任务以每天在

functionToSchedule
运行
00:00
。 如果我使用简单的
schedule
库,我不能在
web.run_app(app)

之后粘贴函数调用
python aiohttp
1个回答
0
投票

我假设您知道如何编写一个将在每天 00:00 运行的函数(并且您知道根据您的应用程序负载,这个时间可能不准确),所以我将专注于添加任务。

第一种方式

更直接的是基于这样一个事实,即您可以将循环参数传递给

web.run_app(app, loop=loop)
并在此之前对其进行处理。所以它会是这样的:

if __name__ == '__main__':
    app = web.Application()
    app.router.add_get('/fr', first_route)
    app.router.add_post('/sr', second_route)

    # get the loop and add a task
    loop = asyncio.get_event_loop()
    loop.create_task(function_to_schedule())

    # pass the loop to run_app
    web.run_app(app, loop=loop)

第二种(可能更好)方式

这是官方aiohttp文档中建议的是这样使用

app.cleanup_ctx
(文档中有一个示例):

async def background_tasks(app):
    app['function_to_schedule'] = asyncio.create_task(
        function_to_schedule()
    )
    yield
    app['function_to_schedule'].cancel()
    await app['function_to_schedule']


if __name__ == '__main__':
    app = web.Application()
    app.router.add_get('/fr', first_route)
    app.router.add_post('/sr', second_route)

    app.cleanup_ctx.append(background_tasks)

    web.run_app(app)
© www.soinside.com 2019 - 2024. All rights reserved.