成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

go語言wait函數(shù),golang wait

2. daemon詳解——APIServer

Server接收用戶通過client發(fā)來的請求,按照路由規(guī)則分發(fā),交給后端處理完畢后將結(jié)果返回至client

專注于為中小企業(yè)提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)調(diào)兵山免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

之前說到 start() 中的 NewDaemon() 是初始化Daemon的核心邏輯,APIServer的創(chuàng)建在 start() 中。

初始化router的過程同樣在 start() 里。

那么,還需要關(guān)注一下middleware。它的初始化在start中的 initMiddlewares() ,形參用到了cli.api、serverConfig、pluginStore。

pluginStore在上一行的 plugin.NewStore() 完成初始化,它返回一個Store對象,其中最重要的是定義了注冊回調(diào)函數(shù)的接口

initMiddlewares 定義了不同的中間件,包括:

重新回到上面的 handlerWithGlobalMiddlewares() 函數(shù),它內(nèi)部有一個循環(huán),遍歷了使用的middlewares,對每個middleware調(diào)用 WrapHandler()

Middleware的作用docker的解釋是:

WrapHandler對于不同的middleware有不同的實現(xiàn)版本,它的原型是

在創(chuàng)建好APIServer,連接上Daemon,創(chuàng)建、設(shè)置好Router之后,APIServer就可以向外提供服務(wù)了,它提供的是一個HTTP Server之上標(biāo)準(zhǔn)的RESTful-API,對用戶非常友好。

APIServer的真正運行采用go routine的方式, go cli.api.wait() 真正啟動了APIServer。采用go routine的原因是:如果APIServer出錯,daemon會隨之退出,采用go routine可以在出錯的時候嘗試重啟,保證docker的正常運行。在wait函數(shù)中調(diào)用了serveAPI(),由于之前可能和多個Daemon建立了連接,所以對每個HTTP server,調(diào)用 Serve() 函數(shù)。

Serve函數(shù)為每個client的連接建立goroutine的服務(wù),服務(wù)會解析request,調(diào)用handler,返回結(jié)果。

該函數(shù)并不是docker開發(fā)者自己寫的,而是調(diào)用了GO語言的net/http庫。大概里面的函數(shù)有: readRequest , handler := sh.srv.Handler , ServeHTTP(ResponseWriter, *Request) 等。由于是系統(tǒng)庫,所以先不看了。

附上start中的高層流程:

APIServer是daemon和docker client通信的接口,在daemon的初始化流程中優(yōu)先級非常高。通過初始化apiserver實例、router實例、middleware實例,系統(tǒng)已經(jīng)為APIServer提供了完整的運行環(huán)境。Middleware為在docker和用戶之間做了一層隔離,為用戶提供標(biāo)準(zhǔn)的接口,通過middleware,回調(diào)函數(shù)被注冊進router中。

真正運行時,采用goroutine的方式保證了保證了daemon的穩(wěn)定運行,當(dāng)request到達APIServer中后,APIServer通過main router進行查找,調(diào)用相應(yīng)的router,也就執(zhí)行了相應(yīng)的回調(diào)函數(shù)的調(diào)用,從而實現(xiàn)了對request的處理。

GO語言學(xué)習(xí)系列八——GO函數(shù)(func)的聲明與使用

GO是編譯性語言,所以函數(shù)的順序是無關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫在最前面,其余函數(shù)按照功能需要進行排列

GO的函數(shù) 不支持嵌套,重載和默認(rèn)參數(shù)

GO的函數(shù) 支持 無需聲明變量,可變長度,多返回值,匿名,閉包等

GO的函數(shù)用 func 來聲明,且左大括號 { 不能另起一行

一個簡單的示例:

輸出為:

參數(shù):可以傳0個或多個值來供自己用

返回:通過用 return 來進行返回

輸出為:

上面就是一個典型的多參數(shù)傳遞與多返回值

對例子的說明:

按值傳遞:是對某個變量進行復(fù)制,不能更改原變量的值

引用傳遞:相當(dāng)于按指針傳遞,可以同時改變原來的值,并且消耗的內(nèi)存會更少,只有4或8個字節(jié)的消耗

在上例中,返回值 (d int, e int, f int) { 是進行了命名,如果不想命名可以寫成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:

當(dāng)返回了多個值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來補位,例如上例的返回我們可以寫成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來舍棄掉

在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個可變長度的參數(shù)

輸出為:

在上例中, strs ...string 中, strs 的實際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的參數(shù)的例子,更多一些演變的形式,都非常類似

在GO中 defer 關(guān)鍵字非常重要,相當(dāng)于面相對像中的析構(gòu)函數(shù),也就是在某個函數(shù)執(zhí)行完成后,GO會自動這個;

如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進后出;

當(dāng)某個函數(shù)出現(xiàn)嚴(yán)重錯誤時, defer 也會被調(diào)用

輸出為

這是一個最簡單的測試了,當(dāng)然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時,判斷是哪個函數(shù)出了問題,完全可以根據(jù) defer 打印出來的內(nèi)容來進行判斷,非常快速,這種留給你們?nèi)崿F(xiàn)

一個函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱之為遞歸函數(shù),在做遞歸調(diào)用時,經(jīng)常會將內(nèi)存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用

本篇重點介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct

Go語言設(shè)計與實現(xiàn)(上)

基本設(shè)計思路:

類型轉(zhuǎn)換、類型斷言、動態(tài)派發(fā)。iface,eface。

反射對象具有的方法:

編譯優(yōu)化:

內(nèi)部實現(xiàn):

實現(xiàn) Context 接口有以下幾個類型(空實現(xiàn)就忽略了):

互斥鎖的控制邏輯:

設(shè)計思路:

(以上為寫被讀阻塞,下面是讀被寫阻塞)

總結(jié),讀寫鎖的設(shè)計還是非常巧妙的:

設(shè)計思路:

WaitGroup 有三個暴露的函數(shù):

部件:

設(shè)計思路:

結(jié)構(gòu):

Once 只暴露了一個方法:

實現(xiàn):

三個關(guān)鍵點:

細節(jié):

讓多協(xié)程任務(wù)的開始執(zhí)行時間可控(按順序或歸一)。(Context 是控制結(jié)束時間)

設(shè)計思路: 通過一個鎖和內(nèi)置的 notifyList 隊列實現(xiàn),Wait() 會生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號通知一個(Signal())或所有(Boardcast())等待者(內(nèi)部實現(xiàn)是通過票據(jù)通知的)來控制協(xié)程解除阻塞。

暴露四個函數(shù):

實現(xiàn)細節(jié):

部件:

包: golang.org/x/sync/errgroup

作用:開啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過程并收集首次 err 錯誤。通過 Context 的傳入,還可以控制在首次 err 出現(xiàn)時就終止組內(nèi)各協(xié)程。

設(shè)計思路:

結(jié)構(gòu):

暴露的方法:

實現(xiàn)細節(jié):

注意問題:

包: "golang.org/x/sync/semaphore"

作用:排隊借資源(如錢,有借有還)的一種場景。此包相當(dāng)于對底層信號量的一種暴露。

設(shè)計思路:有一定數(shù)量的資源 Weight,每一個 waiter 攜帶一個 channel 和要借的數(shù)量 n。通過隊列排隊執(zhí)行借貸。

結(jié)構(gòu):

暴露方法:

細節(jié):

部件:

細節(jié):

包: "golang.org/x/sync/singleflight"

作用:防擊穿。瞬時的相同請求只調(diào)用一次,response 被所有相同請求共享。

設(shè)計思路:按請求的 key 分組(一個 *call 是一個組,用 map 映射存儲組),每個組只進行一次訪問,組內(nèi)每個協(xié)程會獲得對應(yīng)結(jié)果的一個拷貝。

結(jié)構(gòu):

邏輯:

細節(jié):

部件:

如有錯誤,請批評指正。

文章題目:go語言wait函數(shù),golang wait
網(wǎng)頁URL:http://jinyejixie.com/article4/hsiiie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、外貿(mào)網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、做網(wǎng)站、自適應(yīng)網(wǎng)站云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
安阳市| 玉环县| 望都县| 渑池县| 宿州市| 孝昌县| 荣昌县| 镇赉县| 泗水县| 沾化县| 孝感市| 正阳县| 鸡西市| 临城县| 玉溪市| 铁岭县| 庆阳市| 锡林浩特市| 安岳县| 郸城县| 武强县| 尖扎县| 睢宁县| 景宁| 庆云县| 神木县| 五常市| 临桂县| 深泽县| 广昌县| 金堂县| 高雄市| 微博| 大连市| 南京市| 宜良县| 定日县| 治多县| 高台县| 泸州市| 汤阴县|