PythonD13 Web開發 非同步IO

2021-10-07 15:17:10 字數 3620 閱讀 7763

非同步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...