2016-11-12 16 views
1

私はasyncioのPythonモジュールで遊んでいますが、私の単純なコードで何が問題なのか分かりません。非同期にタスクを実行することはありません。Asyncioはタスクを非同期に実行しません

#!/usr/bin/env python3  

import asyncio 
import string  


async def print_num(): 
    for x in range(0, 10): 
     print('Number: {}'.format(x)) 
     await asyncio.sleep(1)  

    print('print_num is finished!')  

async def print_alp(): 
    my_list = string.ascii_uppercase  

    for x in my_list: 
     print('Letter: {}'.format(x)) 
     await asyncio.sleep(1)  

    print('print_alp is finished!')  


async def msg(my_msg): 
    print(my_msg) 
    await asyncio.sleep(1)  


async def main(): 
    await msg('Hello World!') 
    await print_alp() 
    await msg('Hello Again!') 
    await print_num()  


if __name__ == '__main__': 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(main()) 
    loop.close() 

はここでスクリプトが呼び出されたときの出力です:

Hello World! 
Letter: A 
Letter: B 
Letter: C 
Letter: D 
Letter: E 
Letter: F 
Letter: G 
Letter: H 
Letter: I 
Letter: J 
Letter: K 
Letter: L 
Letter: M 
Letter: N 
Letter: O 
Letter: P 
Letter: Q 
Letter: R 
Letter: S 
Letter: T 
Letter: U 
Letter: V 
Letter: W 
Letter: X 
Letter: Y 
Letter: Z 
print_alp is finished! 
Hello Again! 
Number: 0 
Number: 1 
Number: 2 
Number: 3 
Number: 4 
Number: 5 
Number: 6 
Number: 7 
Number: 8 
Number: 9 
print_num is finished! 

答えて

2

コードも順次実行されるようにするには、順次機能を呼び出しています。 await thisは、 "thisが返すためにを待つ"という意味です(ただし、thisが実行を中断することを選択した場合、他の場所で既に開始されている他のタスクが実行される可能性があります)。

あなたは非同期タスクを実行したい場合は、あなたがする必要があります。

async def main(): 
    await msg('Hello World!') 
    task1 = asyncio.ensure_future(print_alp()) 
    task2 = asyncio.ensure_future(print_num()) 
    await asyncio.gather(task1, task2) 
    await msg('Hello Again!') 

asyncio.gather機能のマニュアルを参照してください。またはasyncio.waitを使用することもできます。

1

あなたは、彼らが「子」coroutinesのために順次動作しますが、彼らは「隣」coroutinesのために非同期的に振る舞うということですawait文、との混乱の共通ソースに遭遇しています。例えば

import asyncio 

async def child(): 
    i = 5 
    while i > 0: 
     print("Hi, I'm the child coroutine, la la la la la") 
     await asyncio.sleep(1) 
     i -= 1 

async def parent(): 
    print("Hi, I'm the parent coroutine awaiting the child coroutine") 
    await child() # this blocks inside the parent coroutine, but not the neighbour 
    print("Hi, I'm the parent, the child coroutine is now done and I can stop waiting") 

async def neighbour(): 
    i = 5 
    while i > 0: 
     await asyncio.sleep(1) 
     print("Hi, I'm your neighbour!") 
     i -= 1 

async def my_app(): 
    # start the neighbour and parent coroutines and let them coexist in Task wrappers 
    await asyncio.wait([neighbour(), parent()]) 

if __name__ == '__main__': 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(my_app()) 

の出力は以下となります。

Hi, I'm the parent coroutine awaiting the child coroutine 
Hi, I'm the child coroutine, la la la la la 
Hi, I'm the child coroutine, la la la la la 
Hi, I'm your neighbour! 
Hi, I'm the child coroutine, la la la la la 
Hi, I'm your neighbour! 
Hi, I'm the child coroutine, la la la la la 
Hi, I'm your neighbour! 
Hi, I'm the child coroutine, la la la la la 
Hi, I'm your neighbour! 
Hi, I'm the parent, the child coroutine is now done and I can stop waiting 
Hi, I'm your neighbour! 

Process finished with exit code 0 
関連する問題