草庐IT

phoenix-channels

全部标签

go - 迭代 channel 时关闭 channel 的最佳时间

我正在玩Golang,我创建了这个小应用程序来使用goroutines进行多个并发api调用。虽然应用程序正常运行,但在调用完成后,应用程序会卡住,这是有道理的,因为它无法退出rangec循环,因为channel未关闭。我不确定在这种模式下哪里可以更好地关闭channel。packagemainimport"fmt"import"net/http"funcmain(){links:=[]string{"https://github.com/fabpot","https://github.com/andrew","https://github.com/taylorotwell","htt

multithreading - 如何在不等待的情况下从 channel 获取值

在Go中,如果我尝试从channel接收数据,程序将停止执行,直到channel中有某个值。但是,我想做的是让程序继续执行,如果channel中有值,则对其执行操作。我想到的伪代码是这样的:mychan:=make(chanint,1)gosomeGoRoutine(mychan)//Thismightputsomevalueinmychanatsomepointfor{ifsomethingin"mychan"{//Removetheelementfrom"mychan"andprocessit}else{//Othercode}}据我所知,我不能简单地使用v因为这会阻止程序执行,直

loops - Golang 在带有 channel 的 goroutine 中暂停循环

我有一个作为goroutine启动的函数:func(bt*BlinkyTape)finiteLoop(frames[]Frame,repeatint,delaytime.Duration){bt.isPlaying=trueL:fori:=0;i此函数使用channel,因此可以打破循环(循环可以是有限的或无限的)我想实现的是一种暂停循环执行并当然能够恢复它的方法。我想在选择条件中添加另一个案例,我在另一个channelpause上收听。如果案例被执行,它会进入一个什么都不做的新的无限循环。然后,它将需要与以前相同的系统和一个resumechannel来打破这个循环。你怎么看?有没有更

Go Routines 有时有效,有时会出现关闭 channel 错误

我是Go的新手,我正在尝试了解并发模式。当我运行以下代码时,有时会得到预期的结果(从0到9999的完整数字数组)。其他时候,我只是收到一条显示时间的“就是这样”的消息。有时我只会收到“在关闭的channel上发送”错误。这里可能出了什么问题?packagemainimport("fmt""time""sync")funcJobsDispatcher(inchanint,data[]int){for_,value:=rangedata{in 最佳答案 这个很简单。这就是为什么你从不在goroutine中使用WaitGroup的Add。

go - 在 golang 中创建一段缓冲 channel

我找不到在golang中创建缓冲channel片段的方法。我知道如何创建如下所示的无缓冲channelslicetypechchanintchannels:=make([]ch,5) 最佳答案 此语句channels:=make([]ch,5)只是分配容器(长度为5的channelslice)。除此之外,您必须单独初始化每个channel,这时您会将它们声明为缓冲而不是无缓冲。所以扩展你的例子只是这样做:fori,_:=rangechannels{channels[i]=make(chanint,BufferSize)}

go - 了解 Go channel 死锁

packagemainimport("fmt""time")funcmain(){p:=producer()forc:=rangep{fmt.Println(c)}}funcproducer()运行上面的代码将打印5条消息,然后给出“allgoroutinesareasleep-deadlockerror”。我知道如果我关闭channel,错误就会消失。我想了解的是,goruntime如何知道代码将在channel上无限等待,并且没有其他任何东西可以将数据发送到channel中。现在,如果我向main()函数添加一个额外的go例程......它不会抛出任何错误并继续等待channel。

go - 在结构中嵌入 channel

如何在Go中的结构中嵌入channel?为什么map语法不一致:varmmap[string]int和channel,varmchanint?澄清一下,在Go中可以将一个类型嵌入到另一个类型中。嵌入器类型可以访问嵌入类型上定义的所有方法,但也可以通过类型名称显式引用嵌入类型。因此,map类型声明和channel类型声明之间的不一致让那些想要引用嵌入式channel类型的人感到困惑。 最佳答案 问题是embedding让您主要受益于嵌入式类型的方法(如“EmbeddinginsteadofinheritanceinGo”中所述)和ch

go - 具有非常大限制的 channel 的成本

基本上就是标题所说的。我想知道对channel大小设置较大限制的缺点是什么k:=make(chanint,100000000) 最佳答案 会分配很多内存。在makechan实现中,我们可以看到它在创建channel时完全分配了发送缓冲区:https://github.com/golang/go/blob/master/src/runtime/chan.go#L71因此对于您的特定示例,您将预先分配至少400MB(在32位系统上)或800MB(在64位系统上)内存。如果您发现自己的channel中需要超大缓冲区,是否有可能其他一些数据

go - 为什么我的 channel 会死锁?

我正在尝试编写一个简单的Go脚本来计算不超过8的自然数的总和:packagemainimport"fmt"funcsum(nums[]int,cchanint){varsumint=0for_,v:=rangenums{sum+=v}c但是,运行该程序会产生以下输出。throw:allgoroutinesareasleep-deadlock!goroutine1[chansend]:main.sum(0x44213af00,0x800000004,0x420fbaa0,0x2f29f,0x7aaa8,...)main.go:9+0x6emain.main()main.go:16+0xe

go - 关闭未知长度的 channel

当不知道channel时,我无法关闭channel长度packagemainimport("fmt""time")funcgen(chchanint){variintfor{time.Sleep(time.Millisecond*10)ch100{break}}//hottocloseitproperly?close(ch)}funcreceiver(chchanint){fori:=rangech{fmt.Println("received:",i)}}funcmain(){ch:=make(chanint)fori:=0;i它给我错误panic:sendonclosedchanne