簡體   English   中英

如何同時維護多個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部件。 當然,我可以將這兩個職責划分為單獨的流程,並通過數據庫建立它們的通信,但這會使事情復雜化,因此,我將盡可能避免這種方式。

因此,如何在仍然運行Web應用程序的同時使事件循環重復調用某些方法?

您必須使用loop.create_taskapp.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM