想象一下,您有一个可以通过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应用程序时重复调用事件循环调用某些方法?
答案 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())