真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言net超時(shí)的簡(jiǎn)單介紹

Go語(yǔ)言之Context

golang在1.6.2的時(shí)候還沒(méi)有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的庫(kù)中。中文譯作“上下文”,它主要包含了goroutine 的運(yùn)行狀態(tài)、環(huán)境等信息。

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

context 主要用來(lái)在 goroutine 之間傳遞上下文信息,包括:同步信號(hào)、超時(shí)時(shí)間、截止時(shí)間、請(qǐng)求相關(guān)值等。

該接口定義了四個(gè)需要實(shí)現(xiàn)的方法:

如果有個(gè)網(wǎng)絡(luò)請(qǐng)求Request,然后這個(gè)請(qǐng)求又可以開(kāi)啟多個(gè)goroutine做一些事情,當(dāng)這個(gè)網(wǎng)絡(luò)請(qǐng)求出現(xiàn)異常和超時(shí)時(shí),這個(gè)請(qǐng)求結(jié)束了,這時(shí)候就可以通過(guò)context來(lái)跟蹤這些goroutine,并且通過(guò)Context來(lái)取消他們,然后系統(tǒng)才可回收所占用的資源。

為了更方便的創(chuàng)建Context,包里頭定義了Background來(lái)作為所有Context的根,它是一個(gè)emptyCtx的實(shí)例。

Background返回一個(gè)非空的Context。它永遠(yuǎn)不會(huì)被取消。它通常用來(lái)初始化和測(cè)試使用,作為一個(gè)頂層的context,也就是說(shuō)一般我們創(chuàng)建的context都是基于Background。

TODO返回一個(gè)非空的Context。當(dāng)不清楚要使用哪個(gè)上下文的時(shí)候可以使用TODO。

他們兩個(gè)本質(zhì)上都是emptyCtx結(jié)構(gòu)體類(lèi)型,是一個(gè)不可取消,沒(méi)有設(shè)置截止時(shí)間,沒(méi)有攜帶任何值的Context。

有了如上的根Context,那么是如何衍生更多的子Context的呢?這就要靠context包為我們提供的With系列的函數(shù)了。

通過(guò)這些函數(shù),就創(chuàng)建了一顆Context樹(shù),樹(shù)的每個(gè)節(jié)點(diǎn)都可以有任意多個(gè)子節(jié)點(diǎn),節(jié)點(diǎn)層級(jí)可以有任意多個(gè)。

WithCancel函數(shù),最常用的派生 context 方法。該方法接受一個(gè)父 context。父 context 可以是一個(gè) background context 或其他 context。

WithDeadline函數(shù),該方法會(huì)創(chuàng)建一個(gè)帶有 deadline 的 context。當(dāng) deadline 到期后,該 context 以及該 context 的可能子 context 會(huì)受到 cancel 通知。另外,如果 deadline 前調(diào)用 cancelFunc 則會(huì)提前發(fā)送取消通知。

WithTimeout和WithDeadline基本上一樣,這個(gè)表示是超時(shí)自動(dòng)取消,是多少時(shí)間后自動(dòng)取消Context的意思。

WithValue函數(shù)和取消Context無(wú)關(guān),它是為了生成一個(gè)綁定了一個(gè)鍵值對(duì)數(shù)據(jù)的Context,這個(gè)綁定的數(shù)據(jù)可以通過(guò)Context.Value方法訪(fǎng)問(wèn)到,一般我們想要通過(guò)上下文來(lái)傳遞數(shù)據(jù)時(shí),可以通過(guò)這個(gè)方法,如我們需要tarce追蹤系統(tǒng)調(diào)用棧的時(shí)候。

使用Context的程序應(yīng)遵循以下規(guī)則,以使各個(gè)包之間的接口保持一致:

1.不要將 Context 塞到結(jié)構(gòu)體里。直接將 Context 類(lèi)型作為函數(shù)的第一參數(shù),而且一般都命名為 ctx。

2.不要向函數(shù)傳入一個(gè) nil 的 context,如果你實(shí)在不知道傳什么,標(biāo)準(zhǔn)庫(kù)給你準(zhǔn)備好了一個(gè) context:todo。

3.不要把本應(yīng)該作為函數(shù)參數(shù)的類(lèi)型塞到 context 中,context 存儲(chǔ)的應(yīng)該是一些共同的數(shù)據(jù)。例如:登陸的 session、cookie 等。

4.同一個(gè) context 可能會(huì)被傳遞到多個(gè) goroutine,別擔(dān)心,context 是并發(fā)安全的。

go語(yǔ)言select的作用

Go里面提供了一個(gè)關(guān)鍵字select,通過(guò)select可以監(jiān)聽(tīng)channel上的數(shù)據(jù)流動(dòng)。

select的用法與switch語(yǔ)言非常類(lèi)似,由select開(kāi)始一個(gè)新的選擇塊,每個(gè)選擇條件由case語(yǔ)句來(lái)描述。

與switch語(yǔ)句相比, select有比較多的限制,其中最大的一條限制就是每個(gè)case語(yǔ)句里必須是一個(gè)IO操作,大致的結(jié)構(gòu)如下:

在一個(gè)select語(yǔ)句中,Go語(yǔ)言會(huì)按順序從頭至尾評(píng)估每一個(gè)發(fā)送和接收的語(yǔ)句。

如果其中的任意一語(yǔ)句可以繼續(xù)執(zhí)行(即沒(méi)有被阻塞),那么就從那些可以執(zhí)行的語(yǔ)句中任意選擇一條來(lái)使用。

如果沒(méi)有任意一條語(yǔ)句可以執(zhí)行(即所有的通道都被阻塞),那么有兩種可能的情況:

如果給出了default語(yǔ)句,那么就會(huì)執(zhí)行default語(yǔ)句,同時(shí)程序的執(zhí)行會(huì)從select語(yǔ)句后的語(yǔ)句中恢復(fù)。

如果沒(méi)有default語(yǔ)句,那么select語(yǔ)句將被阻塞,直到至少有一個(gè)通信可以進(jìn)行下去

有時(shí)候會(huì)出現(xiàn)goroutine阻塞的情況,那么我們?nèi)绾伪苊庹麄€(gè)程序進(jìn)入阻塞的情況呢?我們可以利用select來(lái)設(shè)置超時(shí),通過(guò)如下的方式實(shí)現(xiàn):

select總結(jié):

作用: 用來(lái)監(jiān)聽(tīng) channel 上的數(shù)據(jù)流動(dòng)方向。 讀?寫(xiě)?

select實(shí)現(xiàn)fibonacci數(shù)列:

go語(yǔ)言聊天室實(shí)現(xiàn)(七)websocket收消息設(shè)置

上一節(jié)中,我們?yōu)槊總€(gè)連接都創(chuàng)建了一個(gè)goroutine來(lái)讀取其中的消息,現(xiàn)在我們將這個(gè)讀取消息的方法實(shí)現(xiàn)一下。

我們?cè)赼pplication目錄下新建controllers目錄,并在其中創(chuàng)建一個(gè)MessageController.go文件。

首先我們新建一個(gè)MessageController的結(jié)構(gòu)體,內(nèi)容如下

這個(gè)結(jié)構(gòu)體包括兩個(gè)內(nèi)容,一個(gè)是我們將連接放在數(shù)組之后,返回的索引,另一個(gè)是連接本身.

這個(gè)是具體的方法。

我們首先設(shè)置了一下讀消息的大小、超時(shí)時(shí)間以及超時(shí)后需要的操作。

超時(shí)時(shí)間如果設(shè)置為0,那么就是永不超時(shí)。之前在這里直接寫(xiě)0,被告知需要傳一個(gè)time.Time類(lèi)型的數(shù)據(jù)。最終谷歌后才得到了這個(gè)值time.Time{}為"0001-01-01 00:00:00 +0000 UTC"。

我們將用戶(hù)手法消息的內(nèi)容定義為一個(gè)結(jié)構(gòu)體,然后將用戶(hù)的訂閱信息的json通過(guò)json.unmarshal轉(zhuǎn)換成這個(gè)結(jié)構(gòu)體。

之后的switch操作與我們?cè)赟woole中的操作基本雷同,在查詢(xún)到login之后,調(diào)用service中 的login方法來(lái)進(jìn)行注冊(cè)。

下一節(jié)中我們?cè)俳榻B具體的注冊(cè)邏輯。

Go語(yǔ)言的應(yīng)用

Go語(yǔ)言由Google公司開(kāi)發(fā),并于2009年開(kāi)源,相比Java/Python/C等語(yǔ)言,Go尤其擅長(zhǎng)并發(fā)編程,性能堪比C語(yǔ)言,開(kāi)發(fā)效率肩比Python,被譽(yù)為“21世紀(jì)的C語(yǔ)言”。

Go語(yǔ)言在云計(jì)算、大數(shù)據(jù)、微服務(wù)、高并發(fā)領(lǐng)域應(yīng)用應(yīng)用非常廣泛。BAT大廠(chǎng)正在把Go作為新項(xiàng)目開(kāi)發(fā)的首選語(yǔ)言。

Go語(yǔ)言應(yīng)用范圍:

1、服務(wù)端開(kāi)發(fā):以前你使用C或者C++做的那些事情,用Go來(lái)做很合適,例如日志處理、文件系統(tǒng)、監(jiān)控系統(tǒng)等;

2、DevOps:運(yùn)維生態(tài)中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go語(yǔ)言開(kāi)發(fā);

3、網(wǎng)絡(luò)編程:大量?jī)?yōu)秀的Web框架如Echo、Gin、Iris、beego等,而且Go內(nèi)置的 net/http包十分的優(yōu)秀;

4、Paas云平臺(tái)領(lǐng)域:Kubernetes和Docker Swarm等;

5、分布式存儲(chǔ)領(lǐng)域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;

6、區(qū)塊鏈領(lǐng)域:區(qū)塊鏈里面有兩個(gè)明星項(xiàng)目以太坊和fabric都使用Go語(yǔ)言;

7、容器虛擬化:大名鼎鼎的Docker就是使用Go語(yǔ)言實(shí)現(xiàn)的;

8、爬蟲(chóng)及大數(shù)據(jù):Go語(yǔ)言天生支持并發(fā),所以十分適合編寫(xiě)分布式爬蟲(chóng)及大數(shù)據(jù)處理。


本文題目:go語(yǔ)言net超時(shí)的簡(jiǎn)單介紹
網(wǎng)址分享:http://weahome.cn/article/phdjih.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部