草庐IT

GoRoutine

全部标签

go - 在监视器 goroutine 中递归发送

在我编写的一个简单的计时器调度程序中,我正在使用监视器goroutine来同步启动/停止和计时器完成事件。monitorgoroutine,当被剥离到最基本的部分时,看起来像这样:actions:=make(chanfunc(),1024)//monitorgoroutinegofunc(){fora:=rangeactions{a()}}()actions这很好用,直到发送一个Action再发送另一个Action。计划的操作可能会安排另一个操作,这会在达到缓冲区大小时导致死锁。有没有什么干净的方法可以在不诉诸共享状态的情况下解决这个问题(我已经在我的特定问题中尝试过,但非常丑陋)?

go - for 循环中的并发 goroutine

我在for循环中编写了goroutine,如下所示。我想要的是同时为listofDevices列表中的每一项执行goroutine,但此逻辑只为listofDevices列表中的一项运行goroutine。for_,ip:=rangelistOfDevices{inChan谁能帮我解决这个问题?提前致谢。 最佳答案 尝试使用goroutine闭包:gofunc(ccontext.Context){deferwg.Done()pingOneMachine.Run(c)}(ctx)//passinthelexicallyscopedva

amazon-web-services - aws-sdk-go 中的 Goroutine 泄漏?

我有以下使用当前aws-sdk-go版本v1.7.9的代码片段。sess,_:=session.NewSession()s3client:=s3.New(sess)location,err:=s3client.GetBucketLocation(&s3.GetBucketLocationInput{Bucket:&bucket})我记录调用GetBucketLocation()前后的调用堆栈。我看到goroutines的总数增加了两个,随后运行了这两个额外的goroutines:goroutine45[IOwait]:net.runtime_pollWait(0x2029008,0x7

windows - 在 "LockOSThread"GoRoutine 中调用函数

我正在编写一个包来使用Go中的EDSDKDLL来控制CanonDSLR。这是应我合作伙伴的要求在我们的婚礼上使用的照相亭的个人项目,完成后我很乐意将其发布到GitHub:)。查看其他地方使用SDK的示例,它不是线程安全的并且使用线程本地资源,因此我需要确保在使用期间从单个线程调用它。虽然不理想,但看起来Go提供了一个“runtime.LockOSThread”函数来执行此操作,尽管它确实被核心DLL互操作代码本身调用,所以我将不得不等待并确定它是否会干扰。我希望应用程序的其余部分能够使用更高级别的接口(interface)调用SDK而不必担心线程,因此我需要一种方法将函数调用请求传递给

go - 这个 goroutine 会永远泄漏/阻塞吗?

对以下行为感到好奇functest()error{ctx,cancel:=context.WithCancel(context.Background())cancel()doneChan:=make(chanbool)gofunc(){//emulatealongrunningfunctiontime.Sleep(time.Minute)//neverexits?doneChan给定上面的函数,如果select语句选择上下文取消,那么试图推送到doneChan的goroutine是否会永远被阻止?在这种情况下,解决方案是始终使用缓冲channel吗? 最佳答

go - 如何测试在 goroutine 中调用了一个函数?

我想确保我们通过使用正确的参数调用函数来启动goroutine。例如:funcMyTest(t*testing.T){service.EXPECT().MyMockFunc(1)service.MyFunc()}funcMyFunc(){goMyMockFunc(1)}当我运行这个测试时,它失败了,因为(我相信)MyMockFunc只在测试已经完成运行后才被调用。有没有办法通过使用正确的参数调用函数来测试我是否启动了goroutine?注意:理想情况下,我希望按原样保留传递给MyMockFunc的参数(例如不添加channel参数)。 最佳答案

go - google go goroutine 的中断模式(速度问题)

我运行一个goroutine来增加一个计数器,它可以被命令行输入“t\n”中断在select语句,如果我选择使用default:,计数器变量j向前飞。这对我来说似乎很正常。但是,如果我选择使用case,柜台j一秒加起来才60左右,而不是10000。事实上,无论我在time.After()中输入什么值,我只能通过select获得大约60Hz的频率声明。为什么?packagemainimport("bufio""fmt""os""strings""time")funcmain(){message:=make(chanstring)gocheck_input(message)work_loo

go - goroutine 中的代码块产生奇怪的错误结果

我有一个很大的N*1名字数组我目前正在使用goroutine来计算名称之间的编辑距离问题是[B][C]的结果不同,可能像ABCBCD7ABCBCD3姓名有20000条记录varnames[]string将名字分成两blocknameCount:=len(names)procs:=2chunkSize:=nameCount/procschannelch:=make(chanint)varwgsync.WaitGroupfori:=0;i0&&distance我把calcEditDist放在了@https://github.com/copywrite/keyboardDistance/bl

concurrency - 从不同的 goroutine 访问一个 channel

我目前有以下代码:packagemainimport("fmt""math/rand""time")varchannel=make(chan[]float32,1)funcmain(){aMap:=initMap()forkey:=rangeaMap{fmt.Print("theiterationnumberis:",key)theSlice:=aMap[key]channel我们有一个包含两个slice的映射,我想做的是获取slice1的最后一个元素并将其作为slice2的最后一个元素,反之亦然。我实际上正在从事一个更大的项目,涉及模拟细胞的split和分化。既然是模拟,所有的分化和

Goroutine实现疑惑

我需要一些帮助来理解如何在这个问题中使用goroutines。我只会发布一些代码片段,但如果您想深入了解,可以查看here基本上,我有一个分发函数,它接收一个被多次调用的请求slice,每次调用该函数时,它都必须将此请求分发给其他函数以实际解析该请求。我正在尝试创建一个channel并启动此函数来解决新goroutine上的请求,因此该程序可以同时处理请求。分发函数的调用方式://RuntriggerthesystemtostartreceivingrequestsfuncRun(){//Sincetheprogramsstartshere,let'smakeachanneltorec