為什麼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 四 流程正...