參考文章
asyncio庫是python3.4後引入的標準庫,其中直接內建了對非同步io的支援,asyncio的程式設計模型就是乙個訊息迴圈,我們直接從asyncio中獲取乙個eventloop,然後把需要執行的協程扔到eventloop這個訊息迴圈中,就實現了非同步操作,下面是使用asyncio非同步實現helloworld的過程(這是在async/await 語法糖沒出來之前的寫法,可能看起來有點複雜)
import asyncio
# 使用裝飾器 將乙個生成器變成協程
@asyncio.coroutine
defhello()
:print
("hello world"
)# 這裡的asyncio.sleep()就是在模擬io操作
r =yield
from asyncio.sleep(1)
print
("hello again"
)if __name__ ==
"__main__"
:#獲取事件迴圈
loop = asyncio.get_event_loop(
)#執行非同步操作
loop.run_until_complete(hello())
#關閉事件池
loop.close(
)
上面一段**其實並沒有進行非同步操作,但是可以進行,我們向事件池中推入兩個hello()封裝的tasks列表,就是在進行非同步操作了,
import asyncio
@asyncio.coroutine
defhello()
:print
("hello world"
) r =
yield
from asyncio.sleep(1)
print
("hello again"
)loop = asyncio.get_event_loop(
)tasks =
[hello(
), hello()]
loop.run_until_complete(asyncio.wait(tasks)
)loop.close(
)
這是執行結果
很明顯,第二個hello函式沒有等第乙個函式返回hello again就開始返回hello world這說明我們的非同步操作成功了
但是可以看到,上述關於封裝成協程類的操作有一些複雜,在python3.5中引入了async/await這一語法糖,於是我們的**可以簡化為
import asyncio
async
defhello()
:print
("hello world"
) r =
await asyncio.sleep(1)
print
("hello again"
)loop = asyncio.get_event_loop(
)tasks =
[hello(
), hello()]
loop.run_until_complete(asyncio.wait(tasks)
)loop.close(
)
python非同步框架asyncio的使用
python對非同步程式設計有原生的支援,即asyncio標準庫,使用非同步io模型可以節約大量的io等待時間,非常適合於爬蟲任務。import time import asyncio import aiohttp 用非同步方式獲取網頁內容 loop asyncio.get event loop 獲...
Python標準庫之asyncio
asyncio是python 3.4版本引入的標準庫,直接內建了對非同步io的支援。asyncio的程式設計模型就是乙個訊息迴圈。我們從asyncio模組中直接獲取乙個eventloop的引用,然後把需要執行的協程扔到eventloop中執行,就實現了非同步io。用asyncio實現hello wo...
Python 多執行緒 asyncio 十六
asyncio 該模組是3.4版本加入的新功能。先來看乙個例子 def a for x in range 3 print a.x x def b for x in abc print b.x x a b 執行結果 a.x 0 a.x 1 a.x 2 b.x a b.x b b.x c 這個例子是乙個...