如何同时维护多个run_forever处理程序?

时间:2016-05-13 10:31:23

标签: python python-asyncio

想象一下,您有一个可以通过Web界面控制的后台处理守护程序。

因此,app是一个对象,有一些负责处理请求的方法和一个需要不时重复调用的特殊方法,无论请求状态如何。

使用aiohttp时,Web部件非常简单:您只需实例化一个应用程序实例,然后根据aiohttp.web.run_app源设置。一切都很清楚。现在让我们假设您的应用实例具有该特殊方法,将其称为app.process,其结构如下:

async def process(self):
    while self._is_running:
        await self._process_single_job()

使用这种方法,您可以调用loop.run_until_complete(app.process()),但它显然会阻塞,因此没有机会设置Web部件。当然,我可以将这两个职责分成不同的流程,并通过数据库建立沟通,但这会使事情变得复杂,所以如果可能的话,我宁愿避免这种情况。

那么,如何在仍然运行Web应用程序时重复调用事件循环调用某些方法?

1 个答案:

答案 0 :(得分:0)

您必须使用loop.create_task安排执行app.process()作为任务:

import asyncio
from aiohttp import web

class MyApp(web.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.process_task = self.loop.create_task(self.process())
        self.on_shutdown.append(lambda app: app.process_task.cancel())

    async def process(self):
        while True:
            print(await asyncio.sleep(1, result='ping'))

if __name__ == '__main__':
    web.run_app(MyApp())