[英]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部件。 當然,我可以將這兩個職責划分為單獨的流程,並通過數據庫建立它們的通信,但這會使事情復雜化,因此,我將盡可能避免這種方式。
因此,如何在仍然運行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())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.