草庐IT

synchronization

全部标签

go - 确保只检索一次值

我正在开发一个Go包来访问网络服务(通过HTTP)。每次我从该服务检索一页数据时,我也会得到可用页数的总数。获得此总数的唯一方法是获取其中一页(通常是第一页)。但是,请求此服务需要时间,我需要执行以下操作:当在Client上调用GetPage方法并首次检索页面时,检索到的总数应存储在该客户端的某个位置。当调用Total方法并且尚未检索到总计时,应获取第一页并返回总计。如果之前通过调用GetPage或Total检索了总计,则应该立即返回,根本不需要任何HTTP请求。这需要被多个goroutines安全使用。我的想法与sync.Once类似,但传递给Do的函数返回一个值,然后缓存该值并在D

go - 让 go 例程等待 rabbitMQ 发送结果

我是Go的新手,我想创建一个管道来转换我收到的每个请求,方法是将它发送到第一个队列(TEST),然后从最后一个队列(RESULT)获取最终结果并将其作为响应。我面临的问题是,响应永远不会等到所有结果从队列中返回。这是代码:funcmain(){requests:=[]int{3,4,5,6,7}varwgsync.WaitGroupwg.Add(1)resArr:=[]string{}gofunc(){for_,r:=rangerequests{rabbitSend("TEST",r)resArr=append(resArr,rabbitSend方法:funcrabbitSend(qu

go - 让 go 例程等待 rabbitMQ 发送结果

我是Go的新手,我想创建一个管道来转换我收到的每个请求,方法是将它发送到第一个队列(TEST),然后从最后一个队列(RESULT)获取最终结果并将其作为响应。我面临的问题是,响应永远不会等到所有结果从队列中返回。这是代码:funcmain(){requests:=[]int{3,4,5,6,7}varwgsync.WaitGroupwg.Add(1)resArr:=[]string{}gofunc(){for_,r:=rangerequests{rabbitSend("TEST",r)resArr=append(resArr,rabbitSend方法:funcrabbitSend(qu

go - 如何与 time.After 进行惯用同步?

我正在编写一个对传入请求进行排队的应用程序。如果一个请求在队列中的时间超过了一定的时间,我想抛出一个超时。我正在用时间做这件事。之后:timeoutCh:=time.After(5*time.Second)select{case处理channel(连同请求)被放入队列,当一个请求被取消处理时,我向channel发送一个信号以命中case语句:processing这样做的问题是,如果已经选择了timeoutCh,处理channel将阻塞,所以我需要一些方法来检查请求是否超时。我考虑过使用共享原子bool值,但如果我这样做:case然后在发送到处理channel之前检查bool值,仍然存在

go - 如何与 time.After 进行惯用同步?

我正在编写一个对传入请求进行排队的应用程序。如果一个请求在队列中的时间超过了一定的时间,我想抛出一个超时。我正在用时间做这件事。之后:timeoutCh:=time.After(5*time.Second)select{case处理channel(连同请求)被放入队列,当一个请求被取消处理时,我向channel发送一个信号以命中case语句:processing这样做的问题是,如果已经选择了timeoutCh,处理channel将阻塞,所以我需要一些方法来检查请求是否超时。我考虑过使用共享原子bool值,但如果我这样做:case然后在发送到处理channel之前检查bool值,仍然存在

go - sync.Pool 比使用 channel 慢很多,为什么要使用 sync.Pool?

看了sync.Pool的设计,发现是两个逻辑,为什么要用localPool来解决锁竞争。我们可以只使用chan来实现一个。使用channel比sync.pool快4倍!pool除了可以clearobject,还有什么优势呢?这是池实现和基准测试代码:packageclientimport("runtime""sync""testing")typeMPoolchaninterface{}typeAstruct{sstringbintoverflow*[2]*[]*string}varp=sync.Pool{New:func()interface{}{returnnew(A)},}varm

go - sync.Pool 比使用 channel 慢很多,为什么要使用 sync.Pool?

看了sync.Pool的设计,发现是两个逻辑,为什么要用localPool来解决锁竞争。我们可以只使用chan来实现一个。使用channel比sync.pool快4倍!pool除了可以clearobject,还有什么优势呢?这是池实现和基准测试代码:packageclientimport("runtime""sync""testing")typeMPoolchaninterface{}typeAstruct{sstringbintoverflow*[2]*[]*string}varp=sync.Pool{New:func()interface{}{returnnew(A)},}varm

http - 如何在Golang HTTP服务器中定义全局计数器

我是GoLang的新手,想要在go-lang中定义一个全局计数器来记录对http服务器进行的查询数量。我认为最简单的方法是定义一个存储当前计数的“全局”变量,并在每个查询中增加它(为方便起见,我们将并发问题放在一边)。无论如何,这是到目前为止我计划实现的代码:packagemainimport("fmt""net/http")count:=0//*Error*non-declarationstatementoutsidefunctionbodyfuncincrement()error{count=count+1returnnil}funcmainHandler(whttp.Respon

http - 如何在Golang HTTP服务器中定义全局计数器

我是GoLang的新手,想要在go-lang中定义一个全局计数器来记录对http服务器进行的查询数量。我认为最简单的方法是定义一个存储当前计数的“全局”变量,并在每个查询中增加它(为方便起见,我们将并发问题放在一边)。无论如何,这是到目前为止我计划实现的代码:packagemainimport("fmt""net/http")count:=0//*Error*non-declarationstatementoutsidefunctionbodyfuncincrement()error{count=count+1returnnil}funcmainHandler(whttp.Respon

Go goroutine 加锁和解锁

我一直在阅读有关goroutines和sync包的信息,我的问题是......在不同goroutines上读取写入数据时,我是否总是需要锁定解锁?例如我的服务器上有一个变量config:=make(map[string]string)然后在不同的goroutines上我想从配置中读取。不使用同步阅读是否安全?我想写作需要使用同步包来完成。但我不确定是否阅读例如我有一个简单的内存缓存系统typeCacheinterface{Get(keystring)interface{}Put(keystring,expiresint64,valueinterface{})}//MemoryCache