python使用asyncio內建庫進行非同步I O

2021-09-13 01:31:25 字數 1791 閱讀 3611

參考文章

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 這個例子是乙個...