2016-05-13 57 views
0

想象一下你有一個後臺處理守護進程,可以通過Web界面進行控制。如何同時維護多個run_forever處理程序?

因此,該應用程序是一個對象,其中有一些負責處理請求的方法以及一個需要不時重複調用的特殊方法,無論請求狀態如何。

當使用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應用程序?

回答

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())