1.asyncio.wait asyncio.gather這兩個都是接受多個future或coro組成的列表,可是不一樣的是,asyncio.gather會將列表中不是task的coro預先封裝爲future,而wait則不會。python
不過,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.的運行原理:async
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產生的前後順序依次去執行。oop
#!/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