草庐IT

GoRoutine

全部标签

go - 如何根据 goroutine 的返回值停止 goroutine

像这里一样,我创建了一个goplayground示例:sGgxEh40ev,但无法正常工作。quit:=make(chanbool)res:=make(chanint)gofunc(){idx:=0for{select{case输出:goroutineisdoingstuff..goroutineisdoingstuff..Ireceived:0Ireceived:1goroutineisdoingstuff..goroutineisdoingstuff..Ireceived:2Ireceived:3goroutineisdoingstuff..goroutineisdoingstuf

multithreading - Goroutine I/O 调度

Golangsgoroutines为goroutine(程序员)提供了一个阻塞I/O的接口(interface)。在幕后,运行时自然地使用某种非阻塞I/O来防止操作系统挂起操作系统线程,以便运行时可以在执行I/O时在操作系统线程之上运行另一个goroutine。运行时何时考虑执行的I/O,以便重新安排goroutine?为了清楚起见,假设我有一个调用Write的net.TCPConn,那么我什么时候可以重新安排goroutine?conn,err:=net.Dial("tcp",serverAddr)conn.Write(buffer)timestamp=time.Now()那是什么时

go - 读取以并发 goroutine 编写的 channel 时缺少最后一个值

我是Go的新手,我想异步运行多个任务,等待所有任务完成并将它们的结果收集到一个slice中。我阅读了很多文档和示例,特别是这个NathanLeClaire'spost,并想出了一些接近我想做的事情(见下面的代码)。机制很简单:10个goroutines被触发,每个goroutines都在一个channel中写入一个值。另一个goroutine读取channel并填充slice。完成所有这些工作后,打印slice。但是结果显示一个9长度的slice(值从0到8)并且第10个值(应该是9)似乎丢失了。该程序退出得很好,我不知道发生了什么。任何提示表示赞赏。这是一个代码示例,可以使用http

http - 在 http 处理程序中执行 Goroutine

如果我在http处理程序中启动一个goroutine,它是否会在返回响应后完成?这是一个示例代码:packagemainimport("fmt""net/http""time")funcworker(){fmt.Println("workerstarted")time.Sleep(time.Second*10)fmt.Println("workercompleted")}funcHomeHandler(whttp.ResponseWriter,r*http.Request){goworker()w.Write([]byte("Hello,World!"))}funcmain(){htt

Golang goroutine 不能使用函数返回值

我希望我可以用golang做类似下面代码的事情:packagemainimport("fmt""time")funcgetA()(int){fmt.Println("getA:Calculating...")time.Sleep(300*time.Millisecond)fmt.Println("getA:Done!")return100}funcgetB()(int){fmt.Println("getB:Calculating...")time.Sleep(400*time.Millisecond)fmt.Println("getB:Done!")return200}funcmain

multithreading - Postgres 锁在不同的 goroutine 上表现不一致

我在go例程和PostgreSQL9.5中遇到了一些与pg_locks不一致的行为。当我创建额外的goroutines并调用SELECTpg_try_advisory_lock(1);时,结果不一致。我可以在某个时刻尝试获取锁,失败,重试并设法获取它,同时没有任何人显式释放锁。我创建了一个小程序来重现该问题。程序流程创建10个协程。他们每个人都试图在初始化时获得相同的锁。每一秒,每个实例都会尝试再次获取锁,如果它还没有获取的话。每一秒我都会探测所有实例并计算有多少已经获得了锁。预期行为:在任何给定时刻,只有1个goroutine会拥有锁。实际结果:设法获取锁的goroutines的数量

go - 如何协调多个 goroutine 的关闭

假设我有一个函数typeFoostruct{}func(a*Foo)Bar(){//someexpensivework-doessomecallstoredis}它在我的应用程序的某个时刻在goroutine中执行。许多这些可能在任何给定点执行。在应用程序终止之前,我想确保所有剩余的goroutines都已完成它们的工作。我可以做这样的事情吗:typeFoostruct{wgsync.WaitGroup}func(a*Foo)Close(){a.wg.Wait()}func(a*Foo)Bar(){a.wg.Add(1)defera.wg.Done()//someexpensivewo

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:=然后如果没有错误我收集通

go - 循环时 goroutine 中的值不正确

我已通读CommonMistakes以及通过-race标志运行我的代码,但我似乎无法查明这里出了什么问题:packagemainimport("fmt")funcmain(){i:=1totalHashFields:=6fori(对于那些感兴趣的人,组合函数是组合algo)这是fmt.Println的一些输出:Outsidegoroutine:[014]Insidegoroutine:[555]Outsidegoroutine:[012345]Insidegoroutine:[555555]基本上,即使我将c作为参数传递给我的匿名go函数,该值始终与此范围之外的值不同。在上面的输出中,

tcp - 不同 Goroutine 中的 ZeroMQ 上下文如何通信?

我正在使用thisasboilerplate,除了在同一个程序中我还有一些goroutines作为工作人员并连接到后端端点tcp://127.0.0.1:5560。我想做的是让它通过更有效的方式连接,例如ipc://、inproc://,甚至是unix套接字。我试过那些,但没有用。Channels是ZeroMQ的禁忌,对吗?那么如何在没有tcp的情况下将不同的goroutines连接到ZeroMQ上下文?有更好的选择吗?更新:代码://Simplemessagequeuingbroker//Sameasrequest-replybrokerbutusingQUEUEdevice////