成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go并發可視化解釋 – select語句

開發 開發工具
在本文中,我將直觀解釋select語句,這是在Go應用程序中處理并發的另一個強大工具。

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

作為一個快速復習:Partier、Candier和Stringer經營著一家咖啡店。Partier負責接受顧客的訂單,然后將這些訂單傳遞給廚房,Candier和Stringer制作咖啡。

Gophers' Cafe(Gopher咖啡館)

在本文中,我將直觀解釋select語句,這是在Go應用程序中處理并發的另一個強大工具。Gophers和他們的虛構咖啡館仍然是我的伙伴,但這次,讓我們聚焦在Partier和點單部分。

情景

Gopher的Cafe意識到越來越多的顧客希望通過外賣應用程序在線訂購咖啡。因此,除了店內點餐外,他們還選擇了一個外賣應用程序。Partier會監視來自兩個通道的訂單,并通過另一個名為queue的通道將這些訂單轉發給Candier和Stringer。

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

當這兩個通道中的任何一個有訂單時,Partier會獲取訂單并將其轉發到queue通道。

如果這兩個通道都有訂單,將會選擇其中一個。在實際的咖啡店中,來自inShopOrders的訂單可能會被優先處理。但是,在Go應用程序中,我們無法保證哪個訂單會被選擇。還要注意,select語句的執行只會選擇一個訂單,Partier不會一次選擇兩個訂單。但是,在許多應用程序中,select語句通常嵌套在for循環中,以便在前一個迭代中剩下的訂單有機會在下一個迭代中被選擇。

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

但是,如果這兩個通道都有訂單,它們將再次進行公平競爭。

默認情況(Default)

在非高峰時段,訂單不多,Partier花費大量時間在等待上。他認為,他可以通過做其他事情來更有效地利用時間,例如清理桌子。這可以通過default來實現:

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)會創建一個普通的<-chan Time,等待duration時間的流逝,然后將當前時間發送到返回的通道上。這個通道在select語句中與其他通道平等對待。正如你所看到的,select語句中的通道可以是不同類型的。

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!")

當處理遠程API調用時,這種技術非常常見,因為我們無法保證遠程服務器何時返回或是否返回。借助于context,通常不需要這樣做。

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

select {
case resp := <-
責任編輯:趙寧寧 來源: 小技術君
相關推薦

2023-10-06 23:31:25

可視化Go

2023-10-20 13:35:19

GoWaitGroup

2023-09-25 12:45:45

Go 語言可視化sync.Mute

2023-09-11 10:17:20

Go編程語言

2017-11-10 11:27:48

Go并行算法

2021-01-28 10:55:31

算法可視化數據

2020-07-01 09:08:55

神經網絡深度學習網絡

2017-12-26 14:05:21

潤乾大屏可視化

2021-07-28 08:32:58

Go并發Select

2024-08-12 10:52:00

AI模型

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2011-07-02 14:12:00

2011-07-11 22:22:38

2022-08-15 08:02:09

Go程序函數

2017-10-14 13:54:26

數據可視化數據信息可視化

2022-08-26 09:15:58

Python可視化plotly

2009-04-21 14:26:41

可視化監控IT管理摩卡

2010-09-03 14:39:15

SQLSELECT語句

2020-08-21 16:08:18

NVIDIA

2010-09-03 15:27:02

SQLSELECT語句
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久久久91 | 成人做爰www免费看 午夜精品久久久久久久久久久久 | 一级一级毛片免费看 | 亚洲精品国产电影 | 狠狠干天天干 | 亚洲精品一区在线观看 | 男人天堂999 | 亚洲成人综合网站 | 韩国久久 | 欧美影院 | 亚洲精品久久嫩草网站秘色 | 黄免费观看视频 | 每日更新av | 久久国产激情视频 | 日韩欧美在线观看一区 | 亚洲国产高清高潮精品美女 | 中文字幕不卡在线观看 | 国产精品久久久久aaaa樱花 | 成人精品国产 | 亚洲视频免费在线看 | 精品国产一区二区三区免费 | av中文字幕网 | 91麻豆精品国产91久久久久久 | 国产一区二区自拍 | 午夜一级黄色片 | 亚洲国产情侣自拍 | 一区二区不卡高清 | 欧美成年网站 | 亚洲精精品| 日韩中文字幕在线视频 | 国产精品一卡二卡三卡 | 午夜电影网 | 国产羞羞视频在线观看 | 亚洲高清视频一区二区 | 亚洲一区中文字幕在线观看 | 亚洲综合二区 | aa级毛片毛片免费观看久 | 国产一区 在线视频 | 中文字幕专区 | 免费成人毛片 | 国产精品入口久久 |