python 在后台调度运行任务

06odsfpq  于 2023-05-05  发布在  Python
关注(0)|答案(1)|浏览(134)

例如:

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)之后粘贴函数调用

egmofgnx

egmofgnx1#

我假设您知道如何编写一个将在每天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)

相关问题