如何同时维护多个 run_forever 处理程序?
How to maintain multiple run_forever handlers simultaneously?
假设您有一个可以由 Web 界面控制的后台处理守护进程。
因此,应用程序是一个对象,具有一些负责处理请求的方法和一个需要不时重复调用的特殊方法,无论请求状态如何。
使用 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 部件。当然,我可以将这两个职责拆分为单独的进程并通过数据库建立它们的通信,但这会使事情复杂化,所以我宁愿尽可能避免这种方式。
那么,如何让事件循环重复调用某些方法,同时仍然是 运行 网络应用程序?
您必须使用 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())
假设您有一个可以由 Web 界面控制的后台处理守护进程。
因此,应用程序是一个对象,具有一些负责处理请求的方法和一个需要不时重复调用的特殊方法,无论请求状态如何。
使用 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 部件。当然,我可以将这两个职责拆分为单独的进程并通过数据库建立它们的通信,但这会使事情复杂化,所以我宁愿尽可能避免这种方式。
那么,如何让事件循环重复调用某些方法,同时仍然是 运行 网络应用程序?
您必须使用 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())