日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Go并發(fā)可視化解釋–select語(yǔ)句

上周,我發(fā)布了一篇關(guān)于如何直觀解釋Golang中通道(Channel)的文章。如果你對(duì)通道仍然感到困惑,請(qǐng)先查看那篇文章:《Go并發(fā)可視化解釋 — Channel》。

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

作為一個(gè)快速?gòu)?fù)習(xí):Partier、Candier和Stringer經(jīng)營(yíng)著一家咖啡店。Partier負(fù)責(zé)接受顧客的訂單,然后將這些訂單傳遞給廚房,Candier和Stringer制作咖啡。

Gophers' Cafe(Gopher咖啡館)

在本文中,我將直觀解釋select語(yǔ)句,這是在Go應(yīng)用程序中處理并發(fā)的另一個(gè)強(qiáng)大工具。Gophers和他們的虛構(gòu)咖啡館仍然是我的伙伴,但這次,讓我們聚焦在Partier和點(diǎn)單部分。

情景

Gopher的Cafe意識(shí)到越來(lái)越多的顧客希望通過外賣應(yīng)用程序在線訂購(gòu)咖啡。因此,除了店內(nèi)點(diǎn)餐外,他們還選擇了一個(gè)外賣應(yīng)用程序。Partier會(huì)監(jiān)視來(lái)自兩個(gè)通道的訂單,并通過另一個(gè)名為queue的通道將這些訂單轉(zhuǎn)發(fā)給Candier和Stringer。

select {
case order := <-appOrders:
    queue <- order
case order := <-inShopOrders:
    queue <- order
}

當(dāng)這兩個(gè)通道中的任何一個(gè)有訂單時(shí),Partier會(huì)獲取訂單并將其轉(zhuǎn)發(fā)到queue通道。

如果這兩個(gè)通道都有訂單,將會(huì)選擇其中一個(gè)。在實(shí)際的咖啡店中,來(lái)自inShopOrders的訂單可能會(huì)被優(yōu)先處理。但是,在Go應(yīng)用程序中,我們無(wú)法保證哪個(gè)訂單會(huì)被選擇。還要注意,select語(yǔ)句的執(zhí)行只會(huì)選擇一個(gè)訂單,Partier不會(huì)一次選擇兩個(gè)訂單。但是,在許多應(yīng)用程序中,select語(yǔ)句通常嵌套在for循環(huán)中,以便在前一個(gè)迭代中剩下的訂單有機(jī)會(huì)在下一個(gè)迭代中被選擇。

select {
case order := <-appOrders:
    queue <- order
case order := <-inShopOrders:
    queue <- order
}

但是,如果這兩個(gè)通道都有訂單,它們將再次進(jìn)行公平競(jìng)爭(zhēng)。

默認(rèn)情況(Default)

在非高峰時(shí)段,訂單不多,Partier花費(fèi)大量時(shí)間在等待上。他認(rèn)為,他可以通過做其他事情來(lái)更有效地利用時(shí)間,例如清理桌子。這可以通過default來(lái)實(shí)現(xiàn):

for {
    select {
    case order := <-appOrders:
        log.Println("There is an order coming from appOrders channel")
        queue <- order
    case order := <-inShopOrders:
        log.Println("There is an order coming from inShopOrders channel")
        queue <- order
    default:
        log.Println("There is no order on both channels, I will do cleaning instead")
        doCleaning()
    }
}

time.After()

time.After(duration)通常與select一起使用,以防止永久等待。與default不同,time.After(duration)會(huì)創(chuàng)建一個(gè)普通的<-chan Time,等待duration時(shí)間的流逝,然后將當(dāng)前時(shí)間發(fā)送到返回的通道上。這個(gè)通道在select語(yǔ)句中與其他通道平等對(duì)待。正如你所看到的,select語(yǔ)句中的通道可以是不同類型的。

shouldClose := false
closeHourCh := time.After(8 * time.Hour)

for !shouldClose {
    select {
    case order := <-appOrders:
        log.Println("There is an order coming from appOrders channel")
        queue <- order
    case order := <-inShopOrders:
        log.Println("There is an order coming from inShopOrders channel")
        queue <- order
    case now := <-closeHourCh:
        log.Printf("It is %v now, the shop is closing\n", now)
        shouldClose = true
    default:
        log.Println("There is no order on both channels, I will go cleaning instead")
        doCleaning()
    }
}

log.Println("Shop is closed, I'm going home now. Bye!")

當(dāng)處理遠(yuǎn)程API調(diào)用時(shí),這種技術(shù)非常常見,因?yàn)槲覀儫o(wú)法保證遠(yuǎn)程服務(wù)器何時(shí)返回或是否返回。借助于context,通常不需要這樣做。

responseChannel := make(chan interface{})
timer := time.NewTimer(timeout)

select {
case resp := <-

本文名稱:Go并發(fā)可視化解釋–select語(yǔ)句
鏈接地址:http://m.5511xx.com/article/cdicecj.html