2017-07-31 14 views
1

実行中のプロセスを中断させ、起動時にコルーチンを呼び出すタイマーを設定しようとしています。しかし、私はこれを達成する正しい方法が何であるか分かりません。私は、Threading.Timerと一緒にAbstractEventLoop.call_laterを見つけましたが、どちらも動作していないようです(または私は間違って使います)。コードはかなり基本的であり、このようなものになります。Python - asyncio/coroutineのタイマー

def set_timer(time): 
    self.timer = Timer(10.0, timeout) 
    self.timer.start() 
    #v2 
    #self.timer = get_event_loop() 
    #self.timer.call_later(10.0, timeout) 
    return 

async def timeout(): 
    await some_func() 
    return 

非ブロックタイマーを設定する正しい方法は何ですか、秒のいくつかの数の後にコールバック関数を呼び出しますか?タイマーをキャンセルできることはボーナスになりますが、必須条件ではありません。私が必要とする主なものは、ノンブロッキングであり、コルーチンをうまく呼び出すことです。今は、オブジェクトがawait'dできないというエラーを返すか(some_funcは決してawait'dされなかった)、期待される出力は決して起こらない。

答えて

1

ensure_futureを使用してTaskを作成することは、実行フローをブロックせずにジョブを実行する一般的な方法です。また、cancelタスクも可能です。

import asyncio 


class Timer: 
    def __init__(self, timeout, callback): 
     self._timeout = timeout 
     self._callback = callback 
     self._task = asyncio.ensure_future(self._job()) 

    async def _job(self): 
     await asyncio.sleep(self._timeout) 
     await self._callback() 

    def cancel(self): 
     self._task.cancel() 


async def timeout_callback(): 
    await asyncio.sleep(0.1) 
    print('echo!') 


async def main(): 
    print('\nfirst example:') 
    timer = Timer(2, timeout_callback) # set timer for two seconds 
    await asyncio.sleep(2.5) # wait to see timer works 

    print('\nsecond example:') 
    timer = Timer(2, timeout_callback) # set timer for two seconds 
    await asyncio.sleep(1) 
    timer.cancel() # cancel it 
    await asyncio.sleep(1.5) # and wait to see it won't call callback 


loop = asyncio.new_event_loop() 
asyncio.set_event_loop(loop) 
try: 
    loop.run_until_complete(main()) 
finally: 
    loop.run_until_complete(loop.shutdown_asyncgens()) 
    loop.close() 

出力::私のプロジェクトに挿入されたとき、これは完全に働いた

first example: 
echo! 

second example: 
+0

、おかげであなたがからを開始するために何かを持っているため

は私が実装例を書きました! –