老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)

go語(yǔ)言發(fā)送數(shù)據(jù) go語(yǔ)言并發(fā)

go語(yǔ)言的channel特性

1、給一個(gè)nil channel發(fā)送數(shù)據(jù),造成永遠(yuǎn)阻塞

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比岳塘網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式岳塘網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋岳塘地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。

2、從一個(gè)nil channel接收數(shù)據(jù),造成永遠(yuǎn)阻塞

3、給一個(gè)已經(jīng)關(guān)閉的channel發(fā)送數(shù)據(jù),引起panic

4、從一個(gè)已經(jīng)關(guān)閉的channel接收數(shù)據(jù),如果緩沖區(qū)中為空,則返回一個(gè)零值

5、無(wú)緩沖的channel是同步的,而有緩沖的channel是非同步的

golang需要service接口嗎

是的,Go語(yǔ)言需要使用service接口來(lái)實(shí)現(xiàn)服務(wù)器端的功能,例如處理HTTP請(qǐng)求、接收和發(fā)送數(shù)據(jù)等等。是的,Go語(yǔ)言需要使用service接口來(lái)實(shí)現(xiàn)服務(wù)器端的功能,例如處理HTTP請(qǐng)求、接收和發(fā)送數(shù)據(jù)等等。

go語(yǔ)言怎樣把json格式的數(shù)據(jù)發(fā)給前端jquery處理

這個(gè)東西跟語(yǔ)言沒(méi)關(guān)系,你要搞清楚http的流程,在你這種情況下,go語(yǔ)言寫的程序是作為http server,jquery作為瀏覽器中運(yùn)行的腳本,你可以使用jquery向服務(wù)器發(fā)送ajax請(qǐng)求,服務(wù)器返回json數(shù)據(jù)就可以了, http.Handle("/json", fooHandler)

http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {

fmt.Fprintf(w, "這里寫上你的json數(shù)據(jù)就行了")

})

log.Fatal(http.ListenAndServe(":8080", nil))

對(duì)于jquery就

$.get("/test/json",function(m){alert(m);});

就可以了

go語(yǔ)言無(wú)緩沖的channel

無(wú)緩沖的通道(unbuffered channel)是指在接收前沒(méi)有能力保存任何值的通道。

這種類型的通道要求發(fā)送goroutine和接收goroutine同時(shí)準(zhǔn)備好,才能完成發(fā)送和接收操作。否則,通道會(huì)導(dǎo)致先執(zhí)行發(fā)送或接收操作的 goroutine 阻塞等待。

這種對(duì)通道進(jìn)行發(fā)送和接收的交互行為本身就是同步的。其中任意一個(gè)操作都無(wú)法離開(kāi)另一個(gè)操作單獨(dú)存在。

阻塞:由于某種原因數(shù)據(jù)沒(méi)有到達(dá),當(dāng)前協(xié)程(線程)持續(xù)處于等待狀態(tài),直到條件滿足,才接觸阻塞。

同步:在兩個(gè)或多個(gè)協(xié)程(線程)間,保持?jǐn)?shù)據(jù)內(nèi)容一致性的機(jī)制。

下圖展示兩個(gè) goroutine 如何利用無(wú)緩沖的通道來(lái)共享一個(gè)值:

在第 1 步,兩個(gè) goroutine 都到達(dá)通道,但哪個(gè)都沒(méi)有開(kāi)始執(zhí)行發(fā)送或者接收。

在第 2 步,左側(cè)的 goroutine 將它的手伸進(jìn)了通道,這模擬了向通道發(fā)送數(shù)據(jù)的行為。這時(shí),這個(gè) goroutine 會(huì)在通道中被鎖住,直到交換完成。

在第 3 步,右側(cè)的 goroutine 將它的手放入通道,這模擬了從通道里接收數(shù)據(jù)。這個(gè) goroutine 一樣也會(huì)在通道中被鎖住,直到交換完成。

在第 4 步和第 5 步,進(jìn)行交換,并最終,在第 6 步,兩個(gè) goroutine 都將它們的手從通道里拿出來(lái),這模擬了被鎖住的 goroutine 得到釋放。兩個(gè) goroutine 現(xiàn)在都可以去做別的事情了。

如果沒(méi)有指定緩沖區(qū)容量,那么該通道就是同步的,因此會(huì)阻塞到發(fā)送者準(zhǔn)備好發(fā)送和接收者準(zhǔn)備好接收。

無(wú)緩沖channel: —— 同步通信

golang使用Nsq

1. 介紹

最近在研究一些消息中間件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等。NSQ是一個(gè)基于Go語(yǔ)言的分布式實(shí)時(shí)消息平臺(tái),它基于MIT開(kāi)源協(xié)議發(fā)布,由bitly公司開(kāi)源出來(lái)的一款簡(jiǎn)單易用的消息中間件。

官方和第三方還為NSQ開(kāi)發(fā)了眾多客戶端功能庫(kù),如官方提供的基于HTTP的nsqd、Go客戶端go-nsq、Python客戶端pynsq、基于Node.js的JavaScript客戶端nsqjs、異步C客戶端libnsq、Java客戶端nsq-java以及基于各種語(yǔ)言的眾多第三方客戶端功能庫(kù)。

1.1 Features

1). Distributed

NSQ提供了分布式的,去中心化,且沒(méi)有單點(diǎn)故障的拓?fù)浣Y(jié)構(gòu),穩(wěn)定的消息傳輸發(fā)布保障,能夠具有高容錯(cuò)和HA(高可用)特性。

2). Scalable易于擴(kuò)展

NSQ支持水平擴(kuò)展,沒(méi)有中心化的brokers。內(nèi)置的發(fā)現(xiàn)服務(wù)簡(jiǎn)化了在集群中增加節(jié)點(diǎn)。同時(shí)支持pub-sub和load-balanced 的消息分發(fā)。

3). Ops Friendly

NSQ非常容易配置和部署,生來(lái)就綁定了一個(gè)管理界面。二進(jìn)制包沒(méi)有運(yùn)行時(shí)依賴。官方有Docker image。

4.Integrated高度集成

官方的 Go 和 Python庫(kù)都有提供。而且為大多數(shù)語(yǔ)言提供了庫(kù)。

1.2 組件

1.3 拓?fù)浣Y(jié)構(gòu)

NSQ推薦通過(guò)他們相應(yīng)的nsqd實(shí)例使用協(xié)同定位發(fā)布者,這意味著即使面對(duì)網(wǎng)絡(luò)分區(qū),消息也會(huì)被保存在本地,直到它們被一個(gè)消費(fèi)者讀取。更重要的是,發(fā)布者不必去發(fā)現(xiàn)其他的nsqd節(jié)點(diǎn),他們總是可以向本地實(shí)例發(fā)布消息。

NSQ

首先,一個(gè)發(fā)布者向它的本地nsqd發(fā)送消息,要做到這點(diǎn),首先要先打開(kāi)一個(gè)連接,然后發(fā)送一個(gè)包含topic和消息主體的發(fā)布命令,在這種情況下,我們將消息發(fā)布到事件topic上以分散到我們不同的worker中。

事件topic會(huì)復(fù)制這些消息并且在每一個(gè)連接topic的channel上進(jìn)行排隊(duì),在我們的案例中,有三個(gè)channel,它們其中之一作為檔案channel。消費(fèi)者會(huì)獲取這些消息并且上傳到S3。

nsqd

每個(gè)channel的消息都會(huì)進(jìn)行排隊(duì),直到一個(gè)worker把他們消費(fèi),如果此隊(duì)列超出了內(nèi)存限制,消息將會(huì)被寫入到磁盤中。Nsqd節(jié)點(diǎn)首先會(huì)向nsqlookup廣播他們的位置信息,一旦它們注冊(cè)成功,worker將會(huì)從nsqlookup服務(wù)器節(jié)點(diǎn)上發(fā)現(xiàn)所有包含事件topic的nsqd節(jié)點(diǎn)。

nsqlookupd

2. Internals

2.1 消息傳遞擔(dān)保

1)客戶表示已經(jīng)準(zhǔn)備好接收消息

2)NSQ 發(fā)送一條消息,并暫時(shí)將數(shù)據(jù)存儲(chǔ)在本地(在 re-queue 或 timeout)

3)客戶端回復(fù) FIN(結(jié)束)或 REQ(重新排隊(duì))分別指示成功或失敗。如果客戶端沒(méi)有回復(fù), NSQ 會(huì)在設(shè)定的時(shí)間超時(shí),自動(dòng)重新排隊(duì)消息

這確保了消息丟失唯一可能的情況是不正常結(jié)束 nsqd 進(jìn)程。在這種情況下,這是在內(nèi)存中的任何信息(或任何緩沖未刷新到磁盤)都將丟失。

如何防止消息丟失是最重要的,即使是這個(gè)意外情況可以得到緩解。一種解決方案是構(gòu)成冗余 nsqd對(duì)(在不同的主機(jī)上)接收消息的相同部分的副本。因?yàn)槟銓?shí)現(xiàn)的消費(fèi)者是冪等的,以兩倍時(shí)間處理這些消息不會(huì)對(duì)下游造成影響,并使得系統(tǒng)能夠承受任何單一節(jié)點(diǎn)故障而不會(huì)丟失信息。

2.2 簡(jiǎn)化配置和管理

單個(gè) nsqd 實(shí)例被設(shè)計(jì)成可以同時(shí)處理多個(gè)數(shù)據(jù)流。流被稱為“話題”和話題有 1 個(gè)或多個(gè)“通道”。每個(gè)通道都接收到一個(gè)話題中所有消息的拷貝。在實(shí)踐中,一個(gè)通道映射到下行服務(wù)消費(fèi)一個(gè)話題。

在更底的層面,每個(gè) nsqd 有一個(gè)與 nsqlookupd 的長(zhǎng)期 TCP 連接,定期推動(dòng)其狀態(tài)。這個(gè)數(shù)據(jù)被 nsqlookupd 用于給消費(fèi)者通知 nsqd 地址。對(duì)于消費(fèi)者來(lái)說(shuō),一個(gè)暴露的 HTTP /lookup 接口用于輪詢。為話題引入一個(gè)新的消費(fèi)者,只需啟動(dòng)一個(gè)配置了 nsqlookup 實(shí)例地址的 NSQ 客戶端。無(wú)需為添加任何新的消費(fèi)者或生產(chǎn)者更改配置,大大降低了開(kāi)銷和復(fù)雜性。

2.3 消除單點(diǎn)故障

NSQ被設(shè)計(jì)以分布的方式被使用。nsqd 客戶端(通過(guò) TCP )連接到指定話題的所有生產(chǎn)者實(shí)例。沒(méi)有中間人,沒(méi)有消息代理,也沒(méi)有單點(diǎn)故障。

這種拓?fù)浣Y(jié)構(gòu)消除單鏈,聚合,反饋。相反,你的消費(fèi)者直接訪問(wèn)所有生產(chǎn)者。從技術(shù)上講,哪個(gè)客戶端連接到哪個(gè) NSQ 不重要,只要有足夠的消費(fèi)者連接到所有生產(chǎn)者,以滿足大量的消息,保證所有東西最終將被處理。對(duì)于 nsqlookupd,高可用性是通過(guò)運(yùn)行多個(gè)實(shí)例來(lái)實(shí)現(xiàn)。他們不直接相互通信和數(shù)據(jù)被認(rèn)為是最終一致。消費(fèi)者輪詢所有的配置的 nsqlookupd 實(shí)例和合并 response。失敗的,無(wú)法訪問(wèn)的,或以其他方式故障的節(jié)點(diǎn)不會(huì)讓系統(tǒng)陷于停頓。

2.4 效率

對(duì)于數(shù)據(jù)的協(xié)議,通過(guò)推送數(shù)據(jù)到客戶端最大限度地提高性能和吞吐量的,而不是等待客戶端拉數(shù)據(jù)。這個(gè)概念,稱之為 RDY 狀態(tài),基本上是客戶端流量控制的一種形式。

efficiency

2.5 心跳和超時(shí)

組合應(yīng)用級(jí)別的心跳和 RDY 狀態(tài),避免頭阻塞現(xiàn)象,也可能使心跳無(wú)用(即,如果消費(fèi)者是在后面的處理消息流的接收緩沖區(qū)中,操作系統(tǒng)將被填滿,堵心跳)為了保證進(jìn)度,所有的網(wǎng)絡(luò) IO 時(shí)間上限勢(shì)必與配置的心跳間隔相關(guān)聯(lián)。這意味著,你可以從字面上拔掉之間的網(wǎng)絡(luò)連接 nsqd 和消費(fèi)者,它會(huì)檢測(cè)并正確處理錯(cuò)誤。當(dāng)檢測(cè)到一個(gè)致命錯(cuò)誤,客戶端連接被強(qiáng)制關(guān)閉。在傳輸中的消息會(huì)超時(shí)而重新排隊(duì)等待傳遞到另一個(gè)消費(fèi)者。最后,錯(cuò)誤會(huì)被記錄并累計(jì)到各種內(nèi)部指標(biāo)。

2.6 分布式

因?yàn)镹SQ沒(méi)有在守護(hù)程序之間共享信息,所以它從一開(kāi)始就是為了分布式操作而生。個(gè)別的機(jī)器可以隨便宕機(jī)隨便啟動(dòng)而不會(huì)影響到系統(tǒng)的其余部分,消息發(fā)布者可以在本地發(fā)布,即使面對(duì)網(wǎng)絡(luò)分區(qū)。

這種“分布式優(yōu)先”的設(shè)計(jì)理念意味著NSQ基本上可以永遠(yuǎn)不斷地?cái)U(kuò)展,需要更高的吞吐量?那就添加更多的nsqd吧。唯一的共享狀態(tài)就是保存在lookup節(jié)點(diǎn)上,甚至它們不需要全局視圖,配置某些nsqd注冊(cè)到某些lookup節(jié)點(diǎn)上這是很簡(jiǎn)單的配置,唯一關(guān)鍵的地方就是消費(fèi)者可以通過(guò)lookup節(jié)點(diǎn)獲取所有完整的節(jié)點(diǎn)集。清晰的故障事件——NSQ在組件內(nèi)建立了一套明確關(guān)于可能導(dǎo)致故障的的故障權(quán)衡機(jī)制,這對(duì)消息傳遞和恢復(fù)都有意義。雖然它們可能不像Kafka系統(tǒng)那樣提供嚴(yán)格的保證級(jí)別,但NSQ簡(jiǎn)單的操作使故障情況非常明顯。

2.7 no replication

不像其他的隊(duì)列組件,NSQ并沒(méi)有提供任何形式的復(fù)制和集群,也正是這點(diǎn)讓它能夠如此簡(jiǎn)單地運(yùn)行,但它確實(shí)對(duì)于一些高保證性高可靠性的消息發(fā)布沒(méi)有足夠的保證。我們可以通過(guò)降低文件同步的時(shí)間來(lái)部分避免,只需通過(guò)一個(gè)標(biāo)志配置,通過(guò)EBS支持我們的隊(duì)列。但是這樣仍然存在一個(gè)消息被發(fā)布后馬上死亡,丟失了有效的寫入的情況。

2.8 沒(méi)有嚴(yán)格的順序

雖然Kafka由一個(gè)有序的日志構(gòu)成,但NSQ不是。消息可以在任何時(shí)間以任何順序進(jìn)入隊(duì)列。在我們使用的案例中,這通常沒(méi)有關(guān)系,因?yàn)樗械臄?shù)據(jù)都被加上了時(shí)間戳,但它并不適合需要嚴(yán)格順序的情況。

2.9 無(wú)數(shù)據(jù)重復(fù)刪除功能

NSQ對(duì)于超時(shí)系統(tǒng),它使用了心跳檢測(cè)機(jī)制去測(cè)試消費(fèi)者是否存活還是死亡。很多原因會(huì)導(dǎo)致我們的consumer無(wú)法完成心跳檢測(cè),所以在consumer中必須有一個(gè)單獨(dú)的步驟確保冪等性。

3. 實(shí)踐安裝過(guò)程

本文將nsq集群具體的安裝過(guò)程略去,大家可以自行參考官網(wǎng),比較簡(jiǎn)單。這部分介紹下筆者實(shí)驗(yàn)的拓?fù)洌约皀sqadmin的相關(guān)信息。

3.1 拓?fù)浣Y(jié)構(gòu)

topology

實(shí)驗(yàn)采用3臺(tái)NSQD服務(wù),2臺(tái)LOOKUPD服務(wù)。

采用官方推薦的拓?fù)洌l(fā)布的服務(wù)和NSQD在一臺(tái)主機(jī)。一共5臺(tái)機(jī)器。

NSQ基本沒(méi)有配置文件,配置通過(guò)命令行指定參數(shù)。

主要命令如下:

LOOKUPD命令

NSQD命令

工具類,消費(fèi)后存儲(chǔ)到本地文件。

發(fā)布一條消息

3.2 nsqadmin

對(duì)Streams的詳細(xì)信息進(jìn)行查看,包括NSQD節(jié)點(diǎn),具體的channel,隊(duì)列中的消息數(shù),連接數(shù)等信息。

nsqadmin

channel

列出所有的NSQD節(jié)點(diǎn):

nodes

消息的統(tǒng)計(jì):

msgs

lookup主機(jī)的列表:

hosts

4. 總結(jié)

NSQ基本核心就是簡(jiǎn)單性,是一個(gè)簡(jiǎn)單的隊(duì)列,這意味著它很容易進(jìn)行故障推理和很容易發(fā)現(xiàn)bug。消費(fèi)者可以自行處理故障事件而不會(huì)影響系統(tǒng)剩下的其余部分。

事實(shí)上,簡(jiǎn)單性是我們決定使用NSQ的首要因素,這方便與我們的許多其他軟件一起維護(hù),通過(guò)引入隊(duì)列使我們得到了堪稱完美的表現(xiàn),通過(guò)隊(duì)列甚至讓我們?cè)黾恿藥讉€(gè)數(shù)量級(jí)的吞吐量。越來(lái)越多的consumer需要一套嚴(yán)格可靠性和順序性保障,這已經(jīng)超過(guò)了NSQ提供的簡(jiǎn)單功能。

結(jié)合我們的業(yè)務(wù)系統(tǒng)來(lái)看,對(duì)于我們所需要傳輸?shù)陌l(fā)票消息,相對(duì)比較敏感,無(wú)法容忍某個(gè)nsqd宕機(jī),或者磁盤無(wú)法使用的情況,該節(jié)點(diǎn)堆積的消息無(wú)法找回。這是我們沒(méi)有選擇該消息中間件的主要原因。簡(jiǎn)單性和可靠性似乎并不能完全滿足。相比Kafka,ops肩負(fù)起更多負(fù)責(zé)的運(yùn)營(yíng)。另一方面,它擁有一個(gè)可復(fù)制的、有序的日志可以提供給我們更好的服務(wù)。但對(duì)于其他適合NSQ的consumer,它為我們服務(wù)的相當(dāng)好,我們期待著繼續(xù)鞏固它的堅(jiān)實(shí)的基礎(chǔ)。

channel使用

【譯文】 原文地址

channel是Go語(yǔ)言的一個(gè)標(biāo)志性特性,為go協(xié)程之間的數(shù)據(jù)交互提供一種非常強(qiáng)大的方式,而不需要使用鎖機(jī)制。

本文將討論channel的兩個(gè)重要屬性,一個(gè)是控制協(xié)程間數(shù)據(jù)發(fā)送和接收,以及對(duì)channel本身控制。

首先討論下關(guān)閉的channel特性。一旦channel被關(guān)閉之后,就不能再繼續(xù)發(fā)送數(shù)據(jù)給該channel,但是還是可以繼續(xù)接收channel中的數(shù)據(jù)。如下所示:

output:

上述例子顯示即使ch在for循環(huán)之前已經(jīng)關(guān)閉,但還是可以正常的讀取緩存中的true值,讀完之后ok就會(huì)被賦值為false表示channel已經(jīng)關(guān)閉,而且value值為對(duì)應(yīng)channel類型bool的默認(rèn)零值false。只要不停地從關(guān)閉的channel接收,就會(huì)無(wú)限的返回默認(rèn)值和false。可以將for循環(huán)次數(shù)改大點(diǎn)試試即可驗(yàn)證。

通過(guò)以上例子可以發(fā)現(xiàn),關(guān)閉的channel可以繼續(xù)接收讀取操作,這種特征是有用的。在使用range讀取帶緩存的channel時(shí)就會(huì)用到,一旦channel關(guān)閉,讀取完緩存中數(shù)據(jù)就會(huì)停止接收數(shù)據(jù)退出。

將前面的例子改為如下:

output:

上面的例子就沒(méi)有false打出來(lái)了。正好是寫入channel里面的兩個(gè)值。

channel與select結(jié)合更能發(fā)揮出其作用,讓我們看一個(gè)例子:

上面的例子,因?yàn)閒inish在主協(xié)程中發(fā)送之后,馬上就會(huì)在select中接收,并執(zhí)行done.Done()。主協(xié)程wait馬上會(huì)退出整個(gè)程序就結(jié)束。但是這里面存在一個(gè)問(wèn)題,如果在select中沒(méi)有添加finish case的話,主協(xié)程就永遠(yuǎn)發(fā)送不了數(shù)據(jù)到finish這個(gè)channel,因?yàn)槠洳粠Ь彺妗_@里就可以通過(guò)將finish改成帶緩存的channel,或者可以讓select中的finish不會(huì)阻塞。

但是出現(xiàn)多個(gè)協(xié)程都在接收f(shuō)inish通道中的數(shù)據(jù)的話,就需要發(fā)送對(duì)應(yīng)協(xié)程數(shù)量的值到channel中才能解決上面的問(wèn)題。但是具體有多少個(gè)協(xié)程這往往是不好確定的,因?yàn)橛行﹨f(xié)程可能是程序其他部分創(chuàng)建的。一個(gè)比較好的選擇就是通過(guò)使用關(guān)閉通道的方法來(lái)實(shí)現(xiàn)各協(xié)程能正常接收并結(jié)束。

如下所示:

output:

上面的例子就是使用了關(guān)閉的channel可以無(wú)限地接收到反饋數(shù)據(jù)。這樣每個(gè)協(xié)程都能從finish通道中讀到關(guān)閉信息并執(zhí)行done.Done()使得主協(xié)程wait能退出。并且不需要關(guān)注多少個(gè)協(xié)程數(shù),就能正確的讓所有協(xié)程讀到finish通道信息。

channel的這個(gè)特性,可以讓程序員無(wú)需關(guān)注后臺(tái)具體執(zhí)行協(xié)程個(gè)數(shù),確保每個(gè)協(xié)程都能接收到通道關(guān)閉信息,而無(wú)需擔(dān)心死鎖問(wèn)題。

通過(guò)上面的例子我們也發(fā)現(xiàn)每個(gè)協(xié)程并不需要從通道中讀取對(duì)應(yīng)類型的數(shù)據(jù),只需讓接收操作能執(zhí)行就行,讓select不被阻塞。所以可以使用空結(jié)構(gòu)體類型,我們可以改成如下:

這里我們只關(guān)注通道是否關(guān)閉這個(gè)信號(hào),而不需要關(guān)注通道里面的數(shù)據(jù),所以可使用空結(jié)構(gòu)體類型通道。

第二個(gè)要討論的是nil通道:如果定義了一個(gè)channel變量沒(méi)有被初始化,或者被賦值為nil,那么該chennel總是處于阻塞狀態(tài)。如下所示:

執(zhí)行結(jié)果為:

因?yàn)閏hannel為nil無(wú)法發(fā)送數(shù)據(jù),當(dāng)然也不能接收數(shù)據(jù):

這個(gè)似乎看起來(lái)不是很重要,但是如果你想使用關(guān)閉channel來(lái)等待多個(gè)channel關(guān)閉的話,這個(gè)特性就有用處了。先看下面的例子:

WaitMany()函數(shù)看起來(lái)好像是一個(gè)等待通道a和b關(guān)閉的好方法,但是存在一個(gè)問(wèn)題。假設(shè)a通道先關(guān)閉,case -a就會(huì)變成非阻塞。因?yàn)閎closed還是false,程序就會(huì)進(jìn)入到一個(gè)死循環(huán)當(dāng)中,導(dǎo)致b通道永遠(yuǎn)無(wú)法確認(rèn)關(guān)閉。

一個(gè)安全的方法就是使用nil通道總是阻塞的特點(diǎn),如下所示:

上面的例子我們?cè)赪aitMany函數(shù)當(dāng)中,當(dāng)a或者b關(guān)閉時(shí),case可執(zhí)行了將對(duì)應(yīng)的通道賦值為nil,讓其阻塞這樣就可以等待另一個(gè)通道關(guān)閉。當(dāng)nil通道是select語(yǔ)句的一部分時(shí),它會(huì)被有效地忽略,因此nil通道a會(huì)從select中刪除它,只留下b,直到它被關(guān)閉,退出循環(huán)。

總之,closed和nil通道的簡(jiǎn)單屬性對(duì)寫出優(yōu)質(zhì)的go程序是很有用的,可以用來(lái)創(chuàng)建高并發(fā)程序。


本文題目:go語(yǔ)言發(fā)送數(shù)據(jù) go語(yǔ)言并發(fā)
鏈接分享:http://www.xueling.net.cn/article/dodhipd.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲cb精品一区二区三区 | 免费网站在线观看人数在哪买 | 2018av天堂在线视频精品观看 | 国产欧美日韩精品一区二区被窝 | 91看片在线?看 | 免费AV片在线观看网址 | 久久精品国产第一区二区三区 | 国产精品一区二区高清在线 | 午夜影院免费观看 | 国产成人精品在线视频 | 99国产精品热久久久久久 | 天天狠天天透天天伊人 | 色一情一区二区三区四区 | 少妇被猛烈进入A片 | 性生交大片免费全毛片 | 国产午夜久久av | 亚洲性毛片 | 亚洲国产精品毛片AV不卡在线 | 日韩精品精品 | 日本特黄特色大片免费视频老年人 | 亚洲精品一区二区三区午夜不卡片 | 国产精品人妻一区夜夜爱 | 99热99 | 日韩欧美久久 | 国产精品人妖ts系列视频 | 午夜高清国产拍精品 | 日本高清有码视频 | 国产免费无遮挡在线观看视频 | 96sao精品视频在线观看 | 青青青爽在线视频观看 | 日日视频 | 国产美女一区二区三区在线观看 | 精品xxxx户外露出视频 | 中国末成年videos水多 | 欧美人与拘牲交大全视频 | 久久久久久亚洲精品 | 国产wwwxx | 亚洲综合AV一区二区三区不卡 | 超碰在线中文字幕 | 亚洲国产成在人网站天堂 | 亚洲综合视频网站 |