日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Go 并發可視化解釋 - Semaphore

來源: 責編: 時間:2023-10-08 07:06:28 300觀看
導讀在這個系列的最后兩篇文章中,我們討論了來自sync包的Mutex和RWMutex。當我們希望只有一個Goroutine能夠獨占地訪問共享數據時,這兩個結構非常有用。然而,在現實生活中,有些用例需要允許多個用戶同時訪問共享資源。這個數

在這個系列的最后兩篇文章中,我們討論了來自sync包的Mutex和RWMutex。當我們希望只有一個Goroutine能夠獨占地訪問共享數據時,這兩個結構非常有用。6jJ28資訊網——每日最新資訊28at.com

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

6jJ28資訊網——每日最新資訊28at.com

1*rNpdTpCmhFyRV0FULxkBvQ.png6jJ28資訊網——每日最新資訊28at.com

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

6jJ28資訊網——每日最新資訊28at.com

1*hMzIXmAgnnqLXUhD8LTIOQ.png6jJ28資訊網——每日最新資訊28at.com

Swimmer非常擅長這項運動。他迅速完成了他的輪次,并迅速釋放了泳道,使其可用于Partier。與此同時,Candier仍然在她的泳道上游泳。6jJ28資訊網——每日最新資訊28at.com

6jJ28資訊網——每日最新資訊28at.com

1*wtiF0BMWk8KY144wVXSgOg.png6jJ28資訊網——每日最新資訊28at.com

Stringer想去游泳,但兩個泳道目前都被占用。他別無選擇,只能等待。他不知道也不關心哪一條泳道會先可用。6jJ28資訊網——每日最新資訊28at.com

6jJ28資訊網——每日最新資訊28at.com

1*jxskbQzVSTQLLp6Lo3nGnQ.png6jJ28資訊網——每日最新資訊28at.com

假設Partier在這項運動中也比Candier更有天賦。盡管在Candier之后開始,但仍然比她早完成。Partier釋放了他的泳道,使其可用于Stringer。6jJ28資訊網——每日最新資訊28at.com

6jJ28資訊網——每日最新資訊28at.com

1*kiRY3yaZ1GUjxu75DLGP5g.png6jJ28資訊網——每日最新資訊28at.com

不久后,Candier完成并釋放了她的泳道。泳道變得可用,但沒有人試圖占用它,它仍然可用。6jJ28資訊網——每日最新資訊28at.com

最后,Stringer完成了他的輪次。他釋放了他的泳道,使兩個泳道都可用。6jJ28資訊網——每日最新資訊28at.com

6jJ28資訊網——每日最新資訊28at.com

1*Xc6fPx1gWLDIQYLv_yL9ww.png6jJ28資訊網——每日最新資訊28at.com

面試

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

真實世界的例子

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

展示你的代碼!

請注意,Semaphore并不像sync.Mutex一樣作為內置組件提供。相反,Go團隊將其作為擴展提供。將其添加到項目中非常簡單:go get golang.org/x/sync。6jJ28資訊網——每日最新資訊28at.com

package mainimport (    "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也相當簡單。6jJ28資訊網——每日最新資訊28at.com

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}}

本文鏈接:http://www.www897cc.com/showinfo-26-12383-0.htmlGo 并發可視化解釋 - Semaphore

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 使用Spring Boot和Next.js創建全棧應用指南

下一篇: Python多線程詳細體驗

標簽:
  • 熱門焦點
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 2023年,我眼中的字節跳動

    此時此刻(2023年7月),字節跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關注的互聯網公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續發布了最新的折疊屏旗艦,尤其號榮耀Magi
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • iQOO Neo8系列新品發布會

    旗艦雙芯 更強更Pro
  • iQOO Neo8系列今日官宣:首發天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯發科新一代旗艦芯片天璣9200+的發布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發搭載這款當前性能最強大的移動平臺
Top 主站蜘蛛池模板: 蒙城县| 曲靖市| 芜湖县| 深泽县| 安仁县| 濮阳县| 和田市| 延安市| 枝江市| 瓦房店市| 周至县| 兴城市| 垫江县| 江孜县| 五台县| 当涂县| 炎陵县| 资兴市| 措勤县| 同仁县| 萨嘎县| 西乡县| 浦北县| 宜章县| 七台河市| 嘉定区| 木里| 屏山县| 杭州市| 绥中县| 镇康县| 凤凰县| 阜康市| 焦作市| 改则县| 巴林左旗| 新龙县| 定兴县| 远安县| 九龙坡区| 大港区|