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

Go 并發(fā)可視化解釋 - Semaphore

開(kāi)發(fā) 前端
在本文中,我將通過(guò)可視化的方式解釋信號(hào)量(Semaphore)的工作原理。我還將與您分享如何在Golang中使用通道來(lái)簡(jiǎn)單實(shí)現(xiàn)信號(hào)量(Semaphore)的方法。

在這個(gè)系列的最后兩篇文章中,我們討論了來(lái)自sync包的Mutex和RWMutex。當(dāng)我們希望只有一個(gè)Goroutine能夠獨(dú)占地訪問(wèn)共享數(shù)據(jù)時(shí),這兩個(gè)結(jié)構(gòu)非常有用。

然而,在現(xiàn)實(shí)生活中,有些用例需要允許多個(gè)用戶(hù)同時(shí)訪問(wèn)共享資源。這個(gè)數(shù)量可以很大,也可以很小,但必須始終是有限的。例如,一個(gè)容納60000人的體育場(chǎng)在任何時(shí)候都不應(yīng)容納超過(guò)這個(gè)數(shù)量的人。或者,在機(jī)場(chǎng),無(wú)論乘客隊(duì)列有多長(zhǎng),同時(shí)允許辦理登機(jī)手續(xù)的最大乘客數(shù)量就是開(kāi)放柜臺(tái)的數(shù)量。在計(jì)算機(jī)科學(xué)中,這種并發(fā)訪問(wèn)的用例是用信號(hào)量(Semaphore)來(lái)建模的。在本文中,我將通過(guò)可視化的方式解釋信號(hào)量(Semaphore)的工作原理。我還將與您分享如何在Golang中使用通道來(lái)簡(jiǎn)單實(shí)現(xiàn)信號(hào)量(Semaphore)的方法。

場(chǎng)景

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

Candier想去游泳。因?yàn)閮蓚€(gè)泳道都可用,所以她可以立即獲得一個(gè)泳道。

1*rNpdTpCmhFyRV0FULxkBvQ.png

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

1*hMzIXmAgnnqLXUhD8LTIOQ.png

Swimmer非常擅長(zhǎng)這項(xiàng)運(yùn)動(dòng)。他迅速完成了他的輪次,并迅速釋放了泳道,使其可用于Partier。與此同時(shí),Candier仍然在她的泳道上游泳。

1*wtiF0BMWk8KY144wVXSgOg.png

Stringer想去游泳,但兩個(gè)泳道目前都被占用。他別無(wú)選擇,只能等待。他不知道也不關(guān)心哪一條泳道會(huì)先可用。

1*jxskbQzVSTQLLp6Lo3nGnQ.png

假設(shè)Partier在這項(xiàng)運(yùn)動(dòng)中也比Candier更有天賦。盡管在Candier之后開(kāi)始,但仍然比她早完成。Partier釋放了他的泳道,使其可用于Stringer。

1*kiRY3yaZ1GUjxu75DLGP5g.png

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

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

1*Xc6fPx1gWLDIQYLv_yL9ww.png

面試

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

真實(shí)世界的例子

辦理登機(jī)手續(xù)柜臺(tái)、體育場(chǎng)的座位以及計(jì)算機(jī)資源,如CPU、內(nèi)存和網(wǎng)絡(luò),有一個(gè)共同點(diǎn):它們都是有限的。通常,控制應(yīng)用程序資源使用是一個(gè)好主意。我曾在我的一個(gè)應(yīng)用程序中使用Semaphore來(lái)限制一次只能有限數(shù)量的并發(fā)資源密集型Goroutine。這也可以通過(guò)一個(gè)包含N個(gè)Goroutine的池來(lái)解決。然而,由于我們的并發(fā)工作負(fù)載不是均勻分布在時(shí)間上的,它可能在0和N之間的任何位置,所以我們發(fā)現(xiàn)Semaphore是一個(gè)更好的選擇。

展示你的代碼!

請(qǐng)注意,Semaphore并不像sync.Mutex一樣作為內(nèi)置組件提供。相反,Go團(tuán)隊(duì)將其作為擴(kuò)展提供。將其添加到項(xiàng)目中非常簡(jiǎn)單: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)
}

實(shí)現(xiàn)自己的Semaphore

如果您不想將golang.org/x/sync/semaphore添加到項(xiàng)目中,使用通道自己實(shí)現(xiàn)Semaphore也相當(dāng)簡(jiǎn)單。

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
}}
責(zé)任編輯:趙寧寧 來(lái)源: 小技術(shù)君
相關(guān)推薦

2023-09-15 11:32:18

selectGo可視化解釋

2023-09-25 12:45:45

Go 語(yǔ)言可視化sync.Mute

2023-10-20 13:35:19

GoWaitGroup

2023-09-11 10:17:20

Go編程語(yǔ)言

2017-11-10 11:27:48

Go并行算法

2021-01-28 10:55:31

算法可視化數(shù)據(jù)

2020-07-01 09:08:55

神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)網(wǎng)絡(luò)

2017-12-26 14:05:21

潤(rùn)乾大屏可視化

2022-02-16 08:26:18

Go并發(fā)信號(hào)量

2024-08-12 10:52:00

AI模型

2020-03-11 14:39:26

數(shù)據(jù)可視化地圖可視化地理信息

2020-11-30 16:01:03

Semaphore

2014-03-14 10:34:28

JavaJava并發(fā)

2011-07-02 14:12:00

2011-07-11 22:22:38

2022-08-15 08:02:09

Go程序函數(shù)

2017-10-14 13:54:26

數(shù)據(jù)可視化數(shù)據(jù)信息可視化

2022-08-26 09:15:58

Python可視化plotly

2009-04-21 14:26:41

可視化監(jiān)控IT管理摩卡

2020-08-21 16:08:18

NVIDIA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产清纯白嫩初高生在线播放视频 | 日韩一区在线播放 | 精品国产乱码久久久久久闺蜜 | 亚洲精品一区二区冲田杏梨 | 久久99蜜桃综合影院免费观看 | 亚洲国产精品久久久久婷婷老年 | 亚洲网在线 | 欧美日韩综合精品 | 韩日一区二区三区 | 亚洲精品国产电影 | 成人在线免费看 | 日韩at| 久久久久91| www.婷婷亚洲基地 | 一区二区三区国产好 | 亚洲网址| 日韩欧美在线视频一区 | 国产成人精品免费视频大全最热 | 国产一区二区麻豆 | 欧美性受 | 日本网站免费观看 | www.日本精品 | 男人天堂色 | 欧美性一区二区三区 | 中国一级特黄毛片大片 | 成人伊人 | 久久久综合色 | 国产精品精品久久久 | 国产精品日本一区二区不卡视频 | 综合久久亚洲 | 日本精品视频一区二区三区四区 | 国产xxx在线观看 | 免费毛片在线 | 久久久久久久一区 | 国产精品欧美一区二区三区 | 精品欧美乱码久久久久久1区2区 | 夫妻午夜影院 | 亚洲精品精品 | 精品久久99| 99国产精品99久久久久久 | 国产精品美女 |