2015-12-20 13 views
10

ようawaitablesを組み合わせ、それを並列にタスクを実行し、Promise.allを使用して完了するために、それらのすべてを待つことは簡単です:は非同期JavaScriptでPromise.all

async function bar(i) { 
    console.log('started', i); 
    await delay(1000); 
    console.log('finished', i); 
} 

async function foo() { 
    await Promise.all([bar(1), bar(2)]); 
} 

// This works too: 
async function my_all(promises) { 
    for (let p of promises) await p; 
} 

async function foo() { 
    await my_all([bar(1), bar(2), bar(3)]); 
} 

私はPythonで、後者を書き換えることを試みた:

import asyncio 

async def bar(i): 
    print('started', i) 
    await asyncio.sleep(1) 
    print('finished', i) 

async def aio_all(seq): 
    for f in seq: 
    await f 

async def main(): 
    await aio_all([bar(i) for i in range(10)]) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main()) 
loop.close() 

しかし、私のタスクは順番に実行されます。

複数の待ち受けを待つ最も簡単な方法は何ですか? 私のアプローチはなぜ機能しませんか?

答えて

16

同等のasyncio.waitを使用することになります。

import asyncio 

async def bar(i): 
    print('started', i) 
    await asyncio.sleep(1) 
    print('finished', i) 

async def main(): 
    await asyncio.wait([bar(i) for i in range(10)]) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main()) 
loop.close() 

私のアプローチが動作しないのはなぜ?

awaitseqの各項目は、そのコルーチンをブロックするためです。したがって、本質的には、非同期としてマスカレードする同期コードがあります。実際にを追加したい場合は、asyncio.waitの独自のバージョンをloop.create_taskまたはasyncio.ensure_futureを使用して実装できます。

EDITアンドリューは、前述のように

、あなたもasyncio.gatherを使用することができます。

+4

あまりにもasyncio.gatherに言及してください –

+0

'wait'は' timeout'引数を許す 'wait'と' gather'の主な違いはありますか? –

関連する問題