当前位置:首页 > 科技  > 软件

Go 并发可视化解释 - Semaphore

来源: 责编: 时间:2023-10-08 07:06:28 384观看
导读在这个系列的最后两篇文章中,我们讨论了来自sync包的Mutex和RWMutex。当我们希望只有一个Goroutine能够独占地访问共享数据时,这两个结构非常有用。然而,在现实生活中,有些用例需要允许多个用户同时访问共享资源。这个数

在这个系列的最后两篇文章中,我们讨论了来自sync包的Mutex和RWMutex。当我们希望只有一个Goroutine能够独占地访问共享数据时,这两个结构非常有用。GuO28资讯网——每日最新资讯28at.com

然而,在现实生活中,有些用例需要允许多个用户同时访问共享资源。这个数量可以很大,也可以很小,但必须始终是有限的。例如,一个容纳60000人的体育场在任何时候都不应容纳超过这个数量的人。或者,在机场,无论乘客队列有多长,同时允许办理登机手续的最大乘客数量就是开放柜台的数量。在计算机科学中,这种并发访问的用例是用信号量(Semaphore)来建模的。在本文中,我将通过可视化的方式解释信号量(Semaphore)的工作原理。我还将与您分享如何在Golang中使用通道来简单实现信号量(Semaphore)的方法。GuO28资讯网——每日最新资讯28at.com

GuO28资讯网——每日最新资讯28at.com

1*rNpdTpCmhFyRV0FULxkBvQ.pngGuO28资讯网——每日最新资讯28at.com

片刻之后,Partier和Swimmer也想去游泳。此时只有一个泳道可用。只有其中一个可以获得泳道,另一个必须等待。当M个Goroutine竞争N(N < M)个槽位时,我们不能保证谁会赢得这个“竞争”。在这种情况下,当M=2和N=1时,假设Swimmer赢了。GuO28资讯网——每日最新资讯28at.com

GuO28资讯网——每日最新资讯28at.com

1*hMzIXmAgnnqLXUhD8LTIOQ.pngGuO28资讯网——每日最新资讯28at.com

Swimmer非常擅长这项运动。他迅速完成了他的轮次,并迅速释放了泳道,使其可用于Partier。与此同时,Candier仍然在她的泳道上游泳。GuO28资讯网——每日最新资讯28at.com

GuO28资讯网——每日最新资讯28at.com

1*wtiF0BMWk8KY144wVXSgOg.pngGuO28资讯网——每日最新资讯28at.com

Stringer想去游泳,但两个泳道目前都被占用。他别无选择,只能等待。他不知道也不关心哪一条泳道会先可用。GuO28资讯网——每日最新资讯28at.com

GuO28资讯网——每日最新资讯28at.com

1*jxskbQzVSTQLLp6Lo3nGnQ.pngGuO28资讯网——每日最新资讯28at.com

假设Partier在这项运动中也比Candier更有天赋。尽管在Candier之后开始,但仍然比她早完成。Partier释放了他的泳道,使其可用于Stringer。GuO28资讯网——每日最新资讯28at.com

GuO28资讯网——每日最新资讯28at.com

1*kiRY3yaZ1GUjxu75DLGP5g.pngGuO28资讯网——每日最新资讯28at.com

不久后,Candier完成并释放了她的泳道。泳道变得可用,但没有人试图占用它,它仍然可用。GuO28资讯网——每日最新资讯28at.com

最后,Stringer完成了他的轮次。他释放了他的泳道,使两个泳道都可用。GuO28资讯网——每日最新资讯28at.com

GuO28资讯网——每日最新资讯28at.com

1*Xc6fPx1gWLDIQYLv_yL9ww.pngGuO28资讯网——每日最新资讯28at.com

面试

在技术面试中,Semaphore这个术语可能听起来有点吓人。然而,正如你在上面的插图中所看到的,它是非常容易理解的。事实上,我曾几次在面试中问过我的面试者关于Semaphore的问题。例如,设计一个在黑色星期五上线的虚拟商店。有很多顾客想进去,但商店最多只能容纳N个顾客。每个顾客进去后没有时间限制,他/她可以一整天待在店里,也可以一进去就离开。当已经有N个顾客在里面时,后来的顾客必须排队等候,直到有人离开。当然,有很多解决这个问题的方法,其中没有一个是对或错的。我希望这篇文章为您提供了处理N个并发访问问题的另一种工具。GuO28资讯网——每日最新资讯28at.com

真实世界的例子

办理登机手续柜台、体育场的座位以及计算机资源,如CPU、内存和网络,有一个共同点:它们都是有限的。通常,控制应用程序资源使用是一个好主意。我曾在我的一个应用程序中使用Semaphore来限制一次只能有限数量的并发资源密集型Goroutine。这也可以通过一个包含N个Goroutine的池来解决。然而,由于我们的并发工作负载不是均匀分布在时间上的,它可能在0和N之间的任何位置,所以我们发现Semaphore是一个更好的选择。GuO28资讯网——每日最新资讯28at.com

展示你的代码!

请注意,Semaphore并不像sync.Mutex一样作为内置组件提供。相反,Go团队将其作为扩展提供。将其添加到项目中非常简单:go get golang.org/x/sync。GuO28资讯网——每日最新资讯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也相当简单。GuO28资讯网——每日最新资讯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.28at.com/showinfo-26-12383-0.htmlGo 并发可视化解释 - Semaphore

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用Spring Boot和Next.js创建全栈应用指南

下一篇: Python多线程详细体验

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
Top