部分待掌握概念
event_loop事件迴圈:程式開啟乙個無限的迴圈,程式設計師會把一些函式註冊到事件迴圈上。當滿足事件發生的時候,呼叫相應的協程函式。
coroutine協程:協程物件,指乙個使用
async
關鍵字定義的函式,它的呼叫不會立即執行函式,而是會返回乙個協程物件。協程物件需要註冊到事件迴圈,由事件迴圈呼叫。
task任務:乙個協程物件就是乙個原生可以掛起的函式,任務則是對協程進一步封裝,其中包含任務的各種狀態。
future: 代表將來執行或沒有執行的任務的結果。它和
task
上沒有本質的區別
async/await關鍵字:
python3
.5 用於定義協程的關鍵字,
async
定義乙個協程,
await
用於掛起阻塞的非同步呼叫介面。
協程:單件事執行的事件並沒有減少,但是非同步執行時間減少,看電視半小時,燒水半小時,在看電視的同時燒水,共用半小時。非同步就是看著水還沒燒開,燒著水,等待水燒開的狀態時,看電視
#importtime
importasyncio
now =lambda: time.time()
#①定義協程函式
async defdo_some_work(x):
('waiting: ', x)
asyncio.sleep(1)
start = now()
#②生成乙個協程
coroutine = do_some_work(2)
#③產生乙個事件迴圈
loop = asyncio.get_event_loop()
#④把要檢測的事情加進來,或者說把任務加進來
loop.run_until_complete(coroutine)
('time: ', now() - start)
importasyncio
importtime
now =lambda: time.time()
#①註冊協程函式
async defdo_some_work(x):
('waiting: ', x)
awaitasyncio.sleep(x)
return'done after {}s'.format(x)
start = now()
#②生成協程
coroutine1 = do_some_work(1)
coroutine2 = do_some_work(2)
coroutine3 = do_some_work(4)
#③生成協程任務
tasks= [
asyncio.ensure_future(coroutine1),
asyncio.ensure_future(coroutine2),
asyncio.ensure_future(coroutine3)
]#④註冊事件迴圈
loop = asyncio.get_event_loop()#
事件迴圈
#⑤註冊三件事情
loop.run_until_complete(asyncio.wait(tasks))# 註冊3
件事情#⑥取出協程任務結果
fortaskintasks:
('task ret: ',task.result())
('time: ', now() - start)
協程巢狀協程
import asyncio import functools 第三層協程 async def test1 print 我是test1 await asyncio.sleep 1 print test1已經睡了1秒 await asyncio.sleep 3 print test1又睡了3秒 ret...
9 協程 協程理論
本節的主題是基於單執行緒來實現併發,即只用乙個主線程 很明顯可利用的cpu只有乙個 情況下實現併發,為此我們需要先回顧下併發的本質 切換 儲存狀態 ps 在介紹程序理論時,提及程序的三種執行狀態,而執行緒才是執行單位,所以也可以將上圖理解為執行緒的三種狀態cpu正在執行乙個任務,會在兩種情況下切走去...
python協程與非同步協程
在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...