2016-11-12 103 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

你遇到困惑的常見原因有await語句,這是他們連續表現爲「孩子」 coroutines但他們的行爲對異步「周邊」 coroutines

例如:

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