草庐IT

GoRoutine

全部标签

go - 如何从按特定顺序执行的 N 个 goroutine 中收集值?

下面是一个Stuff类型的结构。它有三个整数。Number,它的Double及其Power.让我们假设计算给定整数列表的double和幂是一项昂贵的计算。typeStuffstruct{NumberintDoubleintPowerint}funcmain(){nums:=[]int{2,3,4}//givennumbersstuff:=[]Stuff{}//structofstuffwithtransformedintsdouble:=make(chanint)power:=make(chanint)for_,i:=rangenums{godoubleNumber(i,double)

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

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

主作用域结束时不调用 goroutine 的延迟

packagemainimport("fmt""time")funcmain(){fmt.Println("1")deferfmt.Println("-1")gofunc(){fmt.Println("2")deferfmt.Println("-2")time.Sleep(9*time.Second)}()time.Sleep(1*time.Second)fmt.Println("3")}产生输出:123-1但我本以为goroutine的defer会被调用来产生:123-2-1在我的实际代码中,我的goroutine在websocket上被阻塞了......我想我可以发送一个关闭信号,

multithreading - Goroutines 是协作调度的。这是否意味着不让出执行的 goroutine 会导致 goroutine 一个一个运行?

发件人:http://blog.nindalf.com/how-goroutines-work/Asthegoroutinesarescheduledcooperatively,agoroutinethatloopscontinuouslycanstarveothergoroutinesonthesamethread.Goroutinesarecheapanddonotcausethethreadonwhichtheyaremultiplexedtoblockiftheyareblockedonnetworkinputsleepingchanneloperationsorblockin

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语

go - 打断休眠的 goroutine?

有什么方法可以让我执行,例如time.Sleep(time.Second*5000)//basicallyalongperiodoftime然后在我希望的时候“唤醒”休眠的goroutine?我看到Sleep.go中有一个Reset(dDuration),但我无法调用它。有什么想法吗? 最佳答案 没有办法中断time.Sleep,但是,您可以使用time.After。,和一个select语句来获得你想要的功能。展示基本思想的简单示例:packagemainimport("fmt""time")funcmain(){timeoutch

go - 如何向 goroutine 发出停止运行的信号?

我正在尝试停止go例程,但我找不到实现此目的的方法。我正在考虑使用第二个channel,但如果我从中读取它会阻止它,不是吗?。这是一些代码,我希望它能解释我正在尝试做的事情。packagemainimport"fmt"import"time"funcmain(){vartooLateboolproCh:=make(chanstring)gofunc(){for{fmt.Println("working")//ifistooLatewestop/returnitiftooLate{fmt.Println("stopped")return}//processingsomedataandse

戈朗 : how to print data from running goroutine at fixed intervals?

我在理解golang中的channel时遇到了一些问题。据我所知,channel是在给定时间间隔内将数据发布到控制台的正确方式。假设我有一个正在工作的goroutine,然后在我的主循环中我想每秒从那个goroutine打印数据。如何编写这样的代码?一个简单的例子将不胜感激。 最佳答案 您可以在内存中拥有一些protected共享状态,您可以从长时间运行的进程中更新这些状态。然后你有一个计时器每秒触发一次共享状态检查。这是一个简单的例子:http://play.golang.org/p/gfGvhHUWIc代码:packagemai

go - 惯用的 goroutine 终止和错误处理

我在go中有一个简单的并发用例,但我想不出一个优雅的解决方案来解决我的问题。我想编写一个方法fetchAll,它可以从远程服务器并行查询未指定数量的资源。如果任何提取失败,我想立即返回第一个错误。我最初的实现泄漏了goroutines:packagemainimport("fmt""math/rand""sync""time")funcfetchAll()error{wg:=sync.WaitGroup{}errs:=make(chanerror)leaks:=make(map[int]struct{})deferfmt.Println("thesegoroutinesleaked:"

go - 单 channel 上的 Goroutine 解锁顺序

Goroutines在channel上阻塞的顺序是否决定了它们解除阻塞的顺序?我不关心发送的消息的顺序(它们保证是有序的),但会解除阻塞的Goroutines的顺序。想象一个在多个Goroutine(1、2和3)之间共享的空Channelch,每个Goroutine都试图在ch上接收消息。由于ch为空,每个Goroutine都会阻塞。当我向ch发送消息时,Goroutine1会先解除阻塞吗?或者2或3可能会收到第一条消息?(反之亦然,Goroutines试图发送)我有一个playground这似乎表明Goroutines阻塞的顺序是它们被解除阻塞的顺序,但我不确定这是否是由于实现而导致