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

Go 并發可視化解釋 - Semaphore

開發 前端
在本文中,我將通過可視化的方式解釋信號量(Semaphore)的工作原理。我還將與您分享如何在Golang中使用通道來簡單實現信號量(Semaphore)的方法。

在這個系列的最后兩篇文章中,我們討論了來自sync包的Mutex和RWMutex。當我們希望只有一個Goroutine能夠獨占地訪問共享數據時,這兩個結構非常有用。

然而,在現實生活中,有些用例需要允許多個用戶同時訪問共享資源。這個數量可以很大,也可以很小,但必須始終是有限的。例如,一個容納60000人的體育場在任何時候都不應容納超過這個數量的人。或者,在機場,無論乘客隊列有多長,同時允許辦理登機手續的最大乘客數量就是開放柜臺的數量。在計算機科學中,這種并發訪問的用例是用信號量(Semaphore)來建模的。在本文中,我將通過可視化的方式解釋信號量(Semaphore)的工作原理。我還將與您分享如何在Golang中使用通道來簡單實現信號量(Semaphore)的方法。

場景

有4個Gopher想去游泳。然而,只有2個游泳道。每個泳道最多允許1個Gopher在任何時候游泳,但他們可以輪流游泳。

Candier想去游泳。因為兩個泳道都可用,所以她可以立即獲得一個泳道。

1*rNpdTpCmhFyRV0FULxkBvQ.png

片刻之后,Partier和Swimmer也想去游泳。此時只有一個泳道可用。只有其中一個可以獲得泳道,另一個必須等待。當M個Goroutine競爭N(N < M)個槽位時,我們不能保證誰會贏得這個“競爭”。在這種情況下,當M=2和N=1時,假設Swimmer贏了。

1*hMzIXmAgnnqLXUhD8LTIOQ.png

Swimmer非常擅長這項運動。他迅速完成了他的輪次,并迅速釋放了泳道,使其可用于Partier。與此同時,Candier仍然在她的泳道上游泳。

1*wtiF0BMWk8KY144wVXSgOg.png

Stringer想去游泳,但兩個泳道目前都被占用。他別無選擇,只能等待。他不知道也不關心哪一條泳道會先可用。

1*jxskbQzVSTQLLp6Lo3nGnQ.png

假設Partier在這項運動中也比Candier更有天賦。盡管在Candier之后開始,但仍然比她早完成。Partier釋放了他的泳道,使其可用于Stringer。

1*kiRY3yaZ1GUjxu75DLGP5g.png

不久后,Candier完成并釋放了她的泳道。泳道變得可用,但沒有人試圖占用它,它仍然可用。

最后,Stringer完成了他的輪次。他釋放了他的泳道,使兩個泳道都可用。

1*Xc6fPx1gWLDIQYLv_yL9ww.png

面試

在技術面試中,Semaphore這個術語可能聽起來有點嚇人。然而,正如你在上面的插圖中所看到的,它是非常容易理解的。事實上,我曾幾次在面試中問過我的面試者關于Semaphore的問題。例如,設計一個在黑色星期五上線的虛擬商店。有很多顧客想進去,但商店最多只能容納N個顧客。每個顧客進去后沒有時間限制,他/她可以一整天待在店里,也可以一進去就離開。當已經有N個顧客在里面時,后來的顧客必須排隊等候,直到有人離開。當然,有很多解決這個問題的方法,其中沒有一個是對或錯的。我希望這篇文章為您提供了處理N個并發訪問問題的另一種工具。

真實世界的例子

辦理登機手續柜臺、體育場的座位以及計算機資源,如CPU、內存和網絡,有一個共同點:它們都是有限的。通常,控制應用程序資源使用是一個好主意。我曾在我的一個應用程序中使用Semaphore來限制一次只能有限數量的并發資源密集型Goroutine。這也可以通過一個包含N個Goroutine的池來解決。然而,由于我們的并發工作負載不是均勻分布在時間上的,它可能在0和N之間的任何位置,所以我們發現Semaphore是一個更好的選擇。

展示你的代碼!

請注意,Semaphore并不像sync.Mutex一樣作為內置組件提供。相反,Go團隊將其作為擴展提供。將其添加到項目中非常簡單:go get golang.org/x/sync。

package main

import (
    "context"
    "golang.org/x/sync/semaphore"
    "log"
    "time"
)

func main() {
    pool := semaphore.NewWeighted(2)

    go swim("Candier", pool)
    go swim("Swimmer", pool)
    go swim("Partier", pool)
    go swim("Stringer", pool)

    time.Sleep(5 * time.Second) // For brevity, better use sync.WaitGroup

    log.Println("Main: Done, shutting down")
}

func swim(name string, pool *semaphore.Weighted) {
    log.Printf("%v: I want to swim\n", name)

    // In real applications, pass in your context such as HTTP request context
    ctx := context.Background()

    // We can also Acquire/Release more than 1
    // when the workloads consume different amount of resources
    if err := pool.Acquire(ctx, 1); err != nil {
        log.Printf("%v: Ops, something went wrong! I cannot acquire a lane\n", name)
        return
    }

    log.Printf("%v: I got a lane, I'm swimming\n", name)
    time.Sleep(time.Second)
    log.Printf("%v: I'm done. Releasing my lane\n", name)
    pool.Release(1)
}

實現自己的Semaphore

如果您不想將golang.org/x/sync/semaphore添加到項目中,使用通道自己實現Semaphore也相當簡單。

type Semaphore struct {
    ch chan bool
}

func NewSemaphore(weight int) *Semaphore {
    return &Semaphore{
        ch: make(chan bool, weight),
    }
}

func (s *Semaphore) Acquire() {
    s.ch <- true
}

func (s *Semaphore) Release() {
    <-s.ch
}}
責任編輯:趙寧寧 來源: 小技術君
相關推薦

2023-09-15 11:32:18

selectGo可視化解釋

2023-09-25 12:45:45

Go 語言可視化sync.Mute

2023-10-20 13:35:19

GoWaitGroup

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

潤乾大屏可視化

2022-02-16 08:26:18

Go并發信號量

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

2020-11-30 16:01:03

Semaphore

2014-03-14 10:34:28

JavaJava并發

2009-04-21 14:26:41

可視化監控IT管理摩卡

2017-10-14 13:54:26

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

2022-08-15 08:02:09

Go程序函數

2022-08-26 09:15:58

Python可視化plotly

2020-08-21 16:08:18

NVIDIA
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 超碰最新在线 | 国产婷婷精品av在线 | 亚洲a视频| 日韩亚洲欧美综合 | 日韩一二三区视频 | 久久成人18免费网站 | 久久成人精品视频 | 国产精品久久久久9999鸭 | 国产小视频在线 | 国产高清美女一级a毛片久久w | 日日骚网 | 91久久久久久久久久久 | 久久国产综合 | 久久久久久久一区二区三区 | 永久看片 | 久久久久久久国产精品 | 国产激情视频网站 | 日韩aⅴ在线观看 | 国产精品久久久久久久久久 | 黄色在线免费观看视频网站 | 亚洲九九色 | 亚洲国产精品久久 | 国产一区二区在线视频 | 久久久激情 | 日韩在线观看精品 | av日韩精品 | 久久大陆 | 欧美成人一区二区三区片免费 | 四虎海外| av色站| 国产区视频在线观看 | 97精品超碰一区二区三区 | 国产精品国产精品国产专区不卡 | 国产sm主人调教女m视频 | 91av视频在线免费观看 | 欧美日韩中文字幕 | 91麻豆久久久 | 亚洲一区二区三区免费在线观看 | 免费看a| 国产精品九九九 | 一区二区三区四区免费观看 |