非同步io
總結:乙個web的本質
瀏覽器傳送乙個http請求;
伺服器收到請求,生成乙個html文件;
伺服器把html文件作為http響應的body傳送給瀏覽器;
瀏覽器收到http響應,從http body取出html文件並顯示。
正確的做法是底層**由專門的伺服器軟體實現,我們用python專注於生成html文件。因為我們不希望接觸到tcp連線、http原始請求和響應格式
wsgi作為乙個統一的介面,讓我們專心用python編寫web業務。
environ:乙個包含所有http請求資訊的dict物件;
start_response:乙個傳送http響應的函式。
def
(environ, start_response)
: start_response(
'200 ok',[
('content-type'
,'text/html')]
)return
[b''
]#作為body返回
使用簡單的flask框架例項
flask通過python的裝飾器在內部自動地把url和函式給關聯起來,所以,我們寫出來的**就像這樣:
from flask import flask
from flask import request
'/', methods=
['get'
,'post'])
defhome()
:return
'''/signin'
, methods=
['get'])
defsignin_form()
:return
''''''
'/signin'
, methods=
['post'])
defsignin()
:# 需要從request物件讀取表單內容:
/1203149410923264
當**需要執行乙個耗時的io操作時,它只發出io指令,並不等待io結果,然後就去執行其他**了。一段時間後,當io返回結果時,再通知cpu進行處理。
非同步io模型需要乙個訊息迴圈,在訊息迴圈中,主線程不斷地重複「讀取訊息-處理訊息」這一過程:
loop = get_event_loop(
)while
true
: event = loop.get_event(
) process_event(event)
子程式呼叫是通過棧實現的,乙個執行緒就是執行乙個子程式。
協程又稱微執行緒,纖程:看上去也是子程式,但執行過程中,在子程式內部可中斷,然後轉而執行別的子程式,在適當的時候再返回來接著執行,類似中斷。
相對於多執行緒的優勢:
最大的優勢就是協程極高的執行效率。因為子程式切換不是執行緒切換,而是由程式自身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。
第二大優勢就是不需要多執行緒的鎖機制,因為只有乙個執行緒,也不存在同時寫變數衝突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多執行緒高很多。
可以使用多程序+協程提高效率,通過generator實現。
def
consumer()
: r =
''while
true
: n =
yield r
ifnot n:
return
print
('[consumer] consuming %s...'
% n)
r ='200 ok'
defproduce
(c):
c.send(
none
) n =
0while n <5:
n = n +
1print
('[producer] producing %s...'
% n)
r = c.send(n)
print
('[producer] consumer return: %s'
% r)
c.close(
)c = consumer(
)produce(c)
#具體步驟
[consumer] consuming 1…
接著r被賦值為』200 ok』,然後又進入迴圈,執行n = yield r,返回生成器的第二個值,『200 ok』,然後生成器進入暫停,等待下一次啟動。
[producer] consumer return: 200 ok
以此類推…
以下為廖老師概括:
注意到consumer函式是乙個generator,把乙個consumer傳入produce後:
1首先呼叫c.send(none)啟動生成器;
2然後,一旦生產了東西,通過c.send(n)切換到consumer執行;
3consumer通過yield拿到訊息,處理,又通過yield把結果傳回;
4produce拿到consumer處理的結果,繼續生產下一條訊息;
5produce決定不生產了,通過c.close()關閉consumer,整個過程結束。
整個流程無鎖,由乙個執行緒執行,produce和consumer協作完成任務,所以稱為「協程」,而非執行緒的搶占式多工。
asyncio的程式設計模型就是乙個訊息迴圈。我們從asyncio模組中直接獲取乙個eventloop的引用,然後把需要執行的協程扔到eventloop中執行,就實現了非同步io。
使用await代替yield from
使用async替換@asyncio.coroutine
開博13周年
如果把自己的部落格當作乙個人的話,那他應該已經是個13歲的半大小子了。我雖然給他取名叫diary,但完全沒有做到每日一志。一般來說,我在乙個團隊環境幹得輕鬆或者自由的時候,就是它更新最頻繁的時候,反之,則很久一篇不更。部落格這種形式雖然已被冷落,但它的繼任者 自 似乎如火如荼,這也未嘗不是一種欣慰。...
Python使用django搭建web開發環境
檢測是否安裝完成 c windows system32 python v python 3.5.2 安裝 virtualenv c windows system32 pip install virtualenv安裝成功後就可以開始建立虛擬環境,指定乙個你喜歡的目錄 c windows system3...
Linux中Eclipse下搭建Web開發環境
struts2 db driver,選擇connecter j tomcat 建議struts2 connector和tomcat都解壓在同乙個目錄下,方便管理。每次建立動態web工程時,都需要將struts 解壓後的目錄 下的lib目錄中的相應的包移動到project name webconten...