python使用asyncio內置庫進行異步I/O

asyncio庫

參考文章
asyncio庫是python3.4後引入的標準庫,其中直接內置了對異步IO的支持,asyncio的編程模型就是一個消息循環,咱們直接從asyncio中獲取一個eventloop,而後把須要運行的協程扔到eventloop這個消息循環中,就實現了異步操做,下面是使用asyncio異步實現helloworld的過程(這是在async/await 語法糖沒出來以前的寫法,可能看起來有點複雜)python

import asyncio

# 使用裝飾器 將一個生成器變成協程
@asyncio.coroutine
def hello():
    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列表,就是在進行異步操做了,web

import asyncio
@asyncio.coroutine
def hello():
	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 def hello():
	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()
相關文章
相關標籤/搜索