草庐IT

concurrent-collections

全部标签

concurrency - 是否有可能从 Go 中的多个 goroutines 中的一个接收结果?

我最近才了解Google的编程语言Go。我对它提供的并发支持很感兴趣,并着手了解更多相关信息。然而,我去看看Go是如何实现并发的一个特定特性的,到目前为止我还没有看到任何证据表明这个特性存在。这是一个假设情况:假设我们正在编写一个函数来确定特定输入的Foo值。对于任何给定的输入,Foo值在域A或域B中找到(不是在两个域中)。这些领域的搜索技术大不相同,但它们都有一个共同特点,即成功的搜索往往会很快返回,而不成功的搜索必须遍历整个数据集才能穷尽,因此需要很长时间。现在,在其他使用并发的语言(例如Cilk)中,可以对函数Foosearch进行编程,使其生成一个Asearch函数和一个Bse

concurrency - 并发 slice 访问

我正在使用Go进行一些流处理,但在尝试弄清楚如何在没有锁的情况下以“Go方式”执行此操作时遇到了困难。这个人为的例子展示了我面临的问题。我们一次得到一个东西。有一个goroutine将它们缓冲到一个名为things的slice中。当things变满时len(things)==100然后以某种方式处理并重置有n个并发goroutine需要访问things才满从其他goroutines访问“不完整的”things是不可预测的。doSomethingWithPartial和doSomethingWithComplete都不需要改变things代码:varmsync.Mutexvarcount

concurrency - 如何处理 goroutine 中的错误?

我正在尝试同时运行多个任务并返回结果或错误。//datachannelsch:=make(chanint)ch2:=make(chanint)ch2:=make(chanint)//errorchannelserrCh:=make(chanerror)errCh2:=make(chanerror)errCh3:=make(chanerror)//functionsgotaskF(ch,errCh)gotaskF2(ch2,errCh2)gotaskF3(ch3,errCh3)然后我开始检查每个错误。如果有任何错误,我们打印它,否则我们打印每个任务的结果err:=然后如果没有错误我收集通

garbage-collection - 破译垃圾收集输出

我正在使用运行示例程序rahul@g3ck0:~/programs/Remodel$GOGCTRACE=1gorunmain.gogc1(1):0+0+0ms0->0MB422->346(422-76)objects0handoffgc2(1):0+0+0ms0->0MB2791->1664(2867-1203)objects0handoffgc3(1):0+0+0ms1->0MB4576->2632(5779-3147)objects0handoffgc4(1):0+0+0ms1->0MB3380->2771(6527-3756)objects0handoffgc5(1):0+0+0

concurrency - Go 如何决定何时在 goroutine 之间进行上下文切换?

我很好奇Go语言是如何调度goroutines的。它是仅在channel请求和I/O期间切换还是有周期性的协程切换循环? 最佳答案 Go还没有抢占式调度器,但有一个是plannedfor1.2.所以不,Go不会在纯CPU计算期间切换上下文,仅在I/O期间(如果内存不在寄存器中,则从内存读取也被视为I/O)。您可以在Issue543-preemptivescheduling中阅读有关它的一些讨论。. 关于concurrency-Go如何决定何时在goroutine之间进行上下文切换?,我们

concurrency - websocket 发送/接收线程安全(例程安全)吗?

在GO中编写websocket服务器时(在我的例子中使用JSON编解码器),使用两个不同的Go例程来处理同一连接上的数据发送和接收是否安全?由于websocket.JSON.Receive暂停并等待接收数据,我认为一个单独的Go例程来处理数据发送将是一个可行的解决方案,除非在同一进程上无法同时发送/接收连接。那么,下面的工作示例是不好的做法吗?packagemainimport("fmt""net/http""code.google.com/p/go.net/websocket")constqueueSize=20typeInputstruct{Cmdstring}typeOutput

concurrency - 在 goroutine 中选择评估所有其他语句

在使用Go的channel和例程时,我遇到了一种奇怪的行为,我希望有人能解释一下。下面是一个简短的程序,它应该通过channel将字符串发送到在单独的goroutine中运行的“监听器”(选择语句),从而将几个字符串打印到标准输出。packagemainimport("fmt""time")funcmain(){a:=make(chanstring)gofunc(){for{select{case使用gofunc(){fors:=rangea{fmt.Print(s)}}()//orevensimplergofunc(){for{fmt.Print(按预期工作。但是,使用select语

concurrency - Golang channel 选择语句

最近刚在尝试go。我想知道如果您有一个select语句等待几个channel上的通信,并且如果两个或多个channel同时收到一条消息,会发生什么情况。如果所有消息同时到达,select将如何确定接受哪个channel?谢谢! 最佳答案 来自thespec:Ifmultiplecasescanproceed,auniformpseudo-randomchoiceismadetodecidewhichsinglecommunicationwillexecute.所以选择是不确定的。 关于c

concurrency - 并发http请求没有响应

我正在尝试使用Go,但遇到了一个我无法解决的问题。以下代码是最不可能重现我的问题的代码。目标原始代码的一部分是将http请求委托(delegate)给goroutines。每个协程进行一些繁重的图像计算并应该做出响应。packagemainimport("fmt""runtime""net/http")funcmain(){http.HandleFunc("/",handle)http.ListenAndServe(":8080",nil)}funchandle(whttp.ResponseWriter,r*http.Request){//theideaistobeabletohand

mybatis使用collection嵌套查询

  在开发中,可能会遇到一对多的关系,这个时候,一条sql语句就难以胜任这个任务了。只能先执行一条sql,然后根据返回的结果,再做一次sql关联查询,这个时候,使用mybatis的collection就可以实现。  如果第一次查询返回的是一个list集合,那么,后续的查询就是一个for循环。所以不使用collection的做法,在java语言中,就要分两次查询。一般而言,我们的列表查询都是分页查询,所以集合数据不会太大,第二次for循环查询效率还好。  下面介绍mybatis使用collection嵌套查询解决这个问题。这里为了简单,以员工与部门的关系来做这个实验,其实员工与部门的关系还应该使