golang之web程式設計執行流程

2021-07-07 02:58:06 字數 2351 閱讀 3912

為什麼golang做web程式設計比其他語言併發高:

go是通過乙個函式listenandserve來處理這些事情的,這個底層其實這樣處 理的:初始化乙個server物件,然後呼叫了net.listen("tcp", addr),也就是底層用tcp協議搭建了乙個服 務,然後監控我們設定的埠。

下面**來自go的http包的原始碼,通過下面的**我們可以看到整個的http處理過程:

}監控之後如何接收客戶端的請求呢?上面**執行監控埠之後,呼叫了srv.serve(net.listener)函式,這個 函式就是處理接收客戶端的請求資訊。這個函式裡面起了乙個for{},首先通過listener接收請求,其次建立乙個 conn,最後單獨開了乙個goroutine,把這個請求的資料當做引數扔給這個conn去服務:go c.serve()。這個就是 高併發體現了,使用者的每一次請求都是在乙個新的goroutine去服務,相互不影響。

那麼如何具體分配到相應的函式來處理請求呢?conn首先會解析request:c.readrequest(),然後獲取相應的 handler:handler := c.server.handler,也就是我們剛才在呼叫函式listenandserve時候的第二個引數, 我們前面例子傳遞的是nil,也就是為空,那麼預設獲取handler = defaultservemux,那麼這個變數用來做什麼 的呢?對,這個變數就是乙個路由器,它用來匹配url跳轉到其相應的handle函式,那麼這個我們有設定過嗎?有,我 們呼叫的**裡面第一句不是呼叫了http.handlefunc("/", sayhelloname)嘛。這個作用就是註冊了請求/的 路由規則,當請求uri為"/",路由就會轉到函式sayhelloname,defaultservemux會呼叫servehttp方法,這個方法內 部其實就是呼叫sayhelloname本身,最後通過寫入response的資訊反饋到客戶端。

go**的執行流程 通過對http包的分析之後,現在讓我們來梳理一下整個的**執行過程。

首先呼叫http.handlefunc

按順序做了幾件事:

1 呼叫了defaultservermux的handlefunc

2 呼叫了defaultservermux的handle

3 往defaultservemux的map[string]muxentry中增加對應的handler和路由規則 其次呼叫http.listenandserve(":9090", nil)

按順序做了幾件事情:

1 例項化server

2 呼叫server的listenandserve()

3 呼叫net.listen("tcp", addr)監聽埠

4 啟動乙個for迴圈,在迴圈體中accept請求

5 對每個請求例項化乙個conn,並且開啟乙個goroutine為這個請求進行服務go c.serve()

6 讀取每個請求的內容w, err := c.readrequest()

7 判斷handler是否為空,如果沒有設定handler(這個例子就沒有設定handler),handler就設定為 defaultservemux

8 呼叫handler的servehttp

9 在這個例子中,下面就進入到defaultservermux.servehttp

10 根據request選擇handler,並且進入到這個handler的servehttp mux.handler(r).servehttp(w, r)

11 選擇handler:

a 判斷是否有路由能滿足這個request(迴圈遍歷servermux的muxentry)

b 如果有路由滿足,呼叫這個路由handler的servehttp

c 如果沒有路由滿足,呼叫notfoundhandler的servehttp

web前端 之執行機制

我們先來幾道題了解一 驗一下執行機制 console.log 1 settimeout function 0 console.log 2 最後列印順序 1,2,3 我們來看看這是為什麼 js是單執行緒的,同一時間只能做一件事,從上到下執行 任務佇列 settimeout是個非同步任務,非同步任務要掛...

golang程式設計入門之http請求天氣例項

golang學習第一波,使用http get請求高德天氣介面。一 準備內容 1 註冊高德開發者賬號,申請key 2 golang開發工具l可自行 或者程式設計客棧ftjc 119086.html 3 大致了解下golang基礎語法。二 直接上 因為 注釋非常詳盡,故直接上 自定義http get請求...

Activiti工作流之任務的執行 查詢 完成

8張表 select from act re deployment 一 流程部署表 select from act ge bytearray 二 流程二進位製表 select from act re procdef 三 流程定義表 select from act ru execution 四 流程正...