2016-07-24 11 views
7

は別のコルーチンを呼び出すコルーチンを考えてみましょう。 barが通常の機能の場合、このコードが適切な処理を行うためには、何をする必要がありますか(つまり、barに電話をかける必要があります)?コルーチンが期待されるところで、どのように通常の関数を呼び出しますか? <code>bar</code>がコルーチンである場合、これは正常に動作します</p> <pre><code>async def foo(bar): result = await bar() return result </code></pre> <p>:

コルーチンをasync defで定義することは、非同期なことが全くない場合(つまり、決してawaitを使用しない場合)でも完全に可能です。 しかし、fooのコードの中に通常の関数barをラップ/修正/コールする方法を質問すると、barが待つことができます。

答えて

6

必要であれば、単にasyncio.coroutineであなたの同期機能をラップ:

if not asyncio.iscoroutinefunction(bar): 
    bar = asyncio.coroutine(bar) 

を、それが再ラップコルーチンに安全であるので、コルーチン機能テストは、実際に必要とされていない。したがって

async_bar = asyncio.coroutine(sync_or_async_bar) 

、あなたのコードは次のように書き直すことができます:

async def foo(bar): 
    return await asyncio.coroutine(bar)() 
+0

これは動作するようです。興味深いことに、 'asyncio.coroutine(normal_function)()'はジェネレータであり、 'a_coroutine_function()'はコルーチンです。 – DanielSank

+0

これはTaskオブジェクトのように返すジェネレータオブジェクトを扱う方法がありますか? 'Task.done()'を呼び出し、それがまだ実行中かどうかを確認しますか? – Dagrooms

関連する問題

 関連する問題