await這個關鍵詞以及asyncio.wait asyncio.gather


1.asyncio.wait asyncio.gather這兩個都是接受多個future或coro組成的列表,但是不同的是,asyncio.gather會將列表中不是task的coro預先封裝為future,而wait則不會。

不過,loop.run_until_complete(asyncio.wait(tasks))運行時,會首先將tasks列表里的coro先轉換為future

 

2.await關鍵詞。異步io的關鍵在於,await io操作,此時,當前攜程就會被掛起,時間循環轉而執行其他攜程,但是要注意前面這句話,並不是說所有攜程里的await都會導致當前攜程的掛起,要看await后面跟的是什么,如果跟的是我們定義的攜程,則會執行這個攜程,如果是asyncio模塊制作者定義的固有攜程,比如模擬io操作的asyncio.sleep,以及io操作,比如網絡io:asyncio.open_connection這些,才會掛起當前攜程。

 

3.關於asyncio.as_completed.的運行原理:

 

import asyncio
import time

async def a():
    print ("1")
    return 8

b=asyncio.ensure_future(a())
loop = asyncio.get_event_loop()
loop.run_until_complete(b)
#運行到這里產生了一個已經執行完畢的task-b
async def do_some_work(x):
    time.sleep(2)
    print("waiting:",x)
    await asyncio.sleep(x)
    return "Done after {}s".format(x)

async def main():
    coroutine1 = do_some_work(1)
    coroutine2 = do_some_work(2)
    coroutine3 = do_some_work(4)
    coroutine4 = do_some_work(4)
    coroutine5 = do_some_work(4)
    coroutine6 = do_some_work(4)
    coroutine7 = do_some_work(4)
    coroutine8 = do_some_work(4)
    coroutine9 = do_some_work(4)
    tasks = [
        coroutine1,
        coroutine2,
        b,
        coroutine3,
        coroutine4,
        coroutine5,
        coroutine6, 
        coroutine7,
        coroutine8,
        coroutine9,       
    ]#故意在這個tasks列表中加入已經完成的task-b
    for task in asyncio.as_completed(tasks):#這條語句會首先將tasks列表中的coro轉為task
        print ("gaga")
        result = await task#掛起當前攜程,轉而執行別的攜程,直到所有的攜程全部掛起的時候,本攜程才能再次拿到執行權,因為最早完成的是b,所以result是8
        print("Task ret: {}".format(result))

loop.run_until_complete(main())#這條語句首先將main()轉為task,目前只有這一個pending狀態的task,和之前finished狀態的b,所以先執行這個。
#我這里兩次運行了run_until_complete

 4.ensure_future的作用,比如ensure_future(b())是將b()攜程(coro)加入到task中,當我們啟動eventloop的時候,就會按照task產生的先后順序依次去執行。

 

#!/usr/bin/env py3

import asyncio
async def a():
    print ("a")
async def b():
    print ("b")

asyncio.ensure_future(a())
bb=asyncio.ensure_future(b())
loop = asyncio.get_event_loop()
loop.run_until_complete(bb)#雖然傳入的參數是task-bb,但是task-a卻會執行,
#並且是第一個執行,首先打印a,其次打印b

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM