2016-10-19 10 views
5

私はasyncioのPythonドキュメントを調べていましたが、ほとんどの例がAsyncio.ensure_future()ではなくloop.run_until_complete()を使用する理由が不思議です。ほとんどのasyncioの例​​でloop.run_until_complete()を使用するのはなぜですか?

例えば:https://docs.python.org/dev/library/asyncio-task.html

ensure_futureが非ブロッキング機能の利点を実証するためのより良い方法だろうと思われます。一方、run_until_completeは、同期関数のようにループをブロックします。

ensure_futureloop.run_forever()の組み合わせの代わりにrun_until_completeを使用して、複数のコルーチンを同時に実行する必要があるように感じます。

+2

'run_until_complete'は何もブロックしません。これと 'run_forever'の違いは、コルーチンの終了時にループが一時停止することです。それがブロックする唯一の時間は、あなたのコルーチンが決して待たなければならない場合です。 – dirn

+1

私はこのhttp://pastebin.com/Qi8dQ3bhを書きましたが、ループをブロックするようです。 'do_other_things()'は 'do_io()'がスリープを待っていても、 'do_io()'が終了するまで実行されません。 – SamuelN

+2

これはループでスケジュールされたものが他にないためです。 'run_forever'を呼び出す前に' loop.create_task(do_other_things()) 'を呼び出すことを試みてください。 – dirn

答えて

5

run_until_completeは、完了するまで未来を実行するために使用されます。それに続くコードの実行をブロックします。ただし、イベントループが実行されます。将来予定されている先物はすべて、run_until_completeに渡されるまで実行されます。この例で考えると

import asyncio 

async def do_io(): 
    print('io start') 
    await asyncio.sleep(5) 
    print('io end') 

async def do_other_things(): 
    print('doing other thigns') 

loop = asyncio.get_event_loop() 

loop.run_until_complete(do_io()) 
loop.run_until_complete(do_other_things()) 

loop.close() 

do_ioが実行されます。完了後、do_other_thingsが実行されます。あなたがdo_ioを実行する前に、イベントループとdo_other_thingsをスケジュールする場合は、あなたの出力は

io start 
io end 
doing other thigns 

なり、制御がdo_ioからdo_other_thingsときの元待ち受けに切り替わります。

loop.create_task(do_other_things()) 
loop.run_until_complete(do_io()) 

これは、あなた

do_other_thingsdo_io前に予定されていたので、これがあるの出力を取得します。出力を得るにはさまざまな方法がありますが、どちらが実際にアプリケーションが実際に行っているかに依存しますが、出力を得るにはさまざまな方法があります。

doing other thigns 
io start 
io end 

だから私はそれを読者の運動として残します。

関連する問題