草庐IT

并发无锁的艺术

全部标签

go - 坚持 Go 并发

我似乎不知道下一步该做什么。我的目标是使用图像包中的SubImage函数从原始图像创建一个包含所有子图像的数组。我能够在imageSplit()函数中分割图像并通过channel传递给imageReceiver()函数。我实际上在函数imageReceiver()中接收数据,但我不知道如何在从imageSplit()函数接收到所有图像后附加到数组并使用它。//PartitionsImagefuncPartition(srcimage.Image)[]image.Image{newImg:=image.NewNRGBA64(src.Bounds())r:=newImg.Rectdx,dy

映射并发访问

当您在具有并发访问的程序中使用映射时,是否需要在函数中使用互斥锁来读取值? 最佳答案 多个读者,没有作家是可以的:https://groups.google.com/d/msg/golang-nuts/HpLWnGTp-n8/hyUYmnWJqiQJ一个作者,没有读者也行。(否则map就不会太好了。)否则,如果至少有一位作者和至少一位作者或读者,则所有读者和作者必须使用同步来访问map。互斥体可以很好地解决这个问题。 关于映射并发访问,我们在StackOverflow上找到一个类似的问题

使用 for 循环和匿名函数进行并发时出现意外行为

我已经找到了一种让代码按照我想要的方式运行的方法,但我想了解为什么它会这样运行,以便我对Go并发的理解有所提高。我正在测试sync.WaitGroup以等待一些goroutine完成,因为我计划以这种方式向AmazonS3进行多次上传。这是我最初的代码:funcmain(){varwgsync.WaitGroupfori:=1;i我惊讶地看到输出是:6,6,6,6,6。而不是像这样的:2,4,1,5,3。由于循环甚至没有转到6,这对我来说毫无意义。我后来将i变量作为参数传递给匿名函数然后它的行为符合我的预期。为什么会这样?我不明白。 最佳答案

golang请求头并发读写

去环境:GOARCH="amd64"GOBIN="/root/"GOEXE=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux"GOPATH="/data/workspace/kubernetes"GORACE=""GOROOT="/usr/local/go"GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"GO15VENDOREXPERIMENT="1"CC="gcc"GOGCCFLAGS="-fPIC-m64-pthread-fmessage-length=0"CXX="g++"CGO_ENABL

go - 如何理解和实践Go的并发?

我正在学习Go,最强大的功能之一就是并发性。我以前写过PHP脚本,它们是逐行执行的,这就是为什么我很难理解channels和goroutines。是否有任何网站或任何其他资源(书籍、文章等)可以让我看到可以并发处理的任务,以便我可以用Go进行并发练习?如果最后我能看到带有评论和解释的解决方案,为什么我们这样做以及为什么这个解决方案比其他解决方案更好,那就太好了。举个例子,这是让我困惑的任务,我不知道如何处理:我需要做一个解析器,接收起点(例如:http://example.com),然后开始浏览整个网站(例如.com/about、example.com/best-hotels/等),并

algorithm - 并发重读工作负载的数据结构

我正在寻找一种存储32字节字符串并允许使用首选O(1)或O(logN)查找复杂度进行快速查找的数据结构(目标只是确定键是否存在)。删除和插入的复杂性并不重要,因为这些操作很少见。这与问题无关,但我在Go中工作。我可以使用由互斥体支持的hashmap,但争用会是个问题,如果有更好的解决方案,我宁愿避免分片。谢谢 最佳答案 map对于并发读取是安全的。您可以将所需的map放入sync/atomic.Value中,当您想要写入它时,复制map并更改它,然后将其放回Value中。来自docs:Thefollowingexampleshows

go - 处理应用程序中的 NULL 值并发送到数据库

我尝试在我的应用程序中使用可为null的变量,并将其发送到包含默认为null的列的数据库。这是一个示例结构://LocationtypetypeLocationstruct{IDint`schema:"id"`Title*string`schema:"title"`}标题定义为*string,因为它可能为null(例如,没有用户输入或客户端应用程序将其作为null发送)。这是我接收表单数据的函数://JSONLocationCreatefuncfunc(a*App)JSONLocationCreate(whttp.ResponseWriter,r*http.Request){r.Par

go - 多阅读器的并发 POST 不返回响应

我有一个使用echo的概念验证http服务器它接受带有JSON正文的POST请求。我正在尝试使用管道和多写入器将请求主体流式传输到多个POST请求,但它无法正常工作。在下面的示例中,我可以看到数据被发送到2个POST端点,我可以看到来自这些请求的日志,但我从未收到回复,似乎代码挂起等待http.Post(...)要完成的功能。如果我直接调用这2个端点,它们可以正常工作并提供有效的json响应,所以我相信问题出在这段代码上,它是我的路由处理程序。funcImportAggregate(cecho.Context)error{oneR,oneW:=io.Pipe()twoR,twoW:=i

go - 在没有锁的情况下并发读取函数指针是否安全?

假设我有这个:gofunc(){forrangetime.Tick(1*time.Millisecond){a,b=b,a}}()其他地方:i:=a//对于这个问题,i相对于原始a或b的值是什么并不重要。唯一的问题是阅读a是否安全。也就是说,a是否有可能为nil、部分分配、无效、未定义……除有效值之外的任何值?I'vetriedtomakeitfail但到目前为止它总是成功(在我的Mac上)。我无法在TheGoMemoryModel中找到除此引用之外的任何具体信息文档:Readsandwritesofvalueslargerthanasinglemachinewordbehaveasm

go - 映射变量快照的并发读/写

我遇到了一个我无法理解的情况。在我的代码中,我使用的函数需要读取map(但不写入,只循环遍历该map中现有数据的快照)。这是我的代码:typeMyStructstruct{*sync.RWMutexMyMapmap[int]MyDatas}varMapVar=MyStruct{&sync.RWMutex{},make(map[int]MyDatas)}funcMyFunc(){MapVar.Lock()MapSnapshot:=MapVar.MyMapMapVar.Unlock()for_,a:=rangeMapSnapshot{//Mapconcurrentwrite/readocc