2016-05-13 11 views
0

Webインターフェイスで制御できるバックグラウンド処理デーモンがあるとします。複数のrun_foreverハンドラを同時に管理するにはどうすればいいですか?

このように、このアプリケーションは、要求の処理に責任を負うメソッドと、要求の状態に関係なく、時々繰り返し呼び出される必要がある特別なメソッドを持つオブジェクトです。

aiohttpを使用している場合、Web部分はかなり簡単です。アプリケーションインスタンスをインスタンス化し、aiohttp.web.run_appソースごとに設定するだけです。すべてが明確です。それは明らかに、ブロックあなたはloop.run_until_complete(app.process())を呼び出すことができます。このアプローチでは

async def process(self): 
    while self._is_running: 
     await self._process_single_job() 

、しかし、ひいては設定する機会を残さない:それでは、あなたのアプリケーションインスタンスが特別な方法は、そのように構成された、app.processそれを呼び出すことを持っているとしましょうウェブ部分。確かに、私はこれら2つの責任を別々のプロセスに分割し、データベースを使ってコミュニケーションを確立することができましたが、それは事態を複雑にする可能性があるので、この方法を避けることをお勧めします。

ウェブアプリケーションを実行しているときにイベントループが何らかのメソッドを繰り返し呼び出すようにするにはどうすればよいですか?

答えて

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()) 
関連する問題