草庐IT

phoenix-channels

全部标签

go - 在选择中的同一 channel 上读写

这样使用一个channel在两个例程之间交换数据是否可以?c:=make(chanint)gofunc(){variintselect{casec 最佳答案 它works,但通常是个坏主意(tm)你future的软件维护者会因此讨厌你请注意,如果这些循环不完全相同,那么当主goroutine由于没有其他人写入或读取而阻塞时,应用程序将崩溃packagemainimport("fmt")funcmain(){c:=make(chanint)gofunc(){forx:=0;x输出:B-Written2red1A-Written1red

go - 如何通过 channel 获取多个 map[string]int 并将它们合并到一个 map 中?

我正在实现一个计算单词的函数,我正在尝试使用goroutines来编写它。到目前为止,我已经将[]string数组制作成适合原始字符串文本的大小,我将它们分别发送到一个goroutine以计算单词并将它们添加到map内的k/v对[string]int,然后我想将它们全部带入我的channel并阅读所有map并简单地计算总共有多少个单词并返回此map[string]int,但这是我迷路的地方。我试着做类似的事情mapSummary:=make(map[string]int)fork,v:=rangechannel{mapSummary[k]+=v}但这不起作用,因为我在范围内使用了两个变

go - 有没有办法广播到redis中的每个 channel ?

我正在尝试将消息广播到redis中的channel,但每个用户都有自己的channel和他们的user_id。我认为可以使用的方法是获取所有事件channel,然后将其一一发布。因为我知道如果不同的channel,redis无法发布。但问题是,在我使用的库go-redis中,当用户订阅并使用命令PUBSUBCAHNNELS检查redis时,没有channel结果。我在文档中读到订阅功能不会立即激活channel。那么我怎样才能获得订阅channel呢?有什么解决办法吗?我正在使用golang-redishttps://godoc.org/github.com/go-redis/redi

go - 跨 channel 范围还是使用选择更好?

伙计们,我想知道如果我只有一个案例(我的channel)并在给定channel关闭时发出结束信号,是在channel范围内还是使用选择更好?举个例子:1。https://play.golang.org/p/3ZFdbgHSKyNgofunc(){forv:=rangech{//dosomestuff}}()2。https://play.golang.org/p/iCCkDge8j72gofunc(){for{select{casev,ok:=首选哪种解决方案,为什么?请考虑这样一个事实,即goroutines本身可能会产生很多次(很多worker)。 最佳答

recursion - 戈朗 : some questions on channel

http://play.golang.org/p/uRHG-Th_2P我很难理解channel的概念packagemainimport("fmt")funcFibonacci(limitint,chnvarchanint){x,y:=0,1fori:=0;i1)我如何从行中获取错误值v,ok:=如果没有更多的值可以获取,则返回false。如果channel关闭,则也为false。但在这种情况下,channel已关闭但(?)仍然获得真实值。如果我取出收盘价,它就会panic。它如何以及为什么在这里返回true?2)线路goFibonacci(cap(chn),chn)也可以在没有goro

concurrency - Func 不会运行;增量 channel

我正在编写一个函数,我试图在其中增加一个channel。在一个更大的程序中,这是行不通的,它实际上卡在一条看起来像这样的线上:current=gofuncs正在运行,但程序似乎在这一行停止了。我试图编写一个较小的SSCCE,但现在我遇到了不同的问题。在这里:packagemainimport("fmt")funcmain(){count:=make(chanint)gofunc(countchanint){current:=0for{current=然而,在上面的gofunc实际上似乎根本没有被调用。如果我放一个fmt.Printlnfor{之前的声明,它不会打印出来。如果我把fmt.

几分钟后,Go 爬虫在从输出 channel 中选择时停止

我写了一个简单的爬虫,看起来像这样:typeSiteDatastruct{//...}funcdownloadURL(urlstring)(body[]byte,statusint){resp,err:=http.Get(url)iferr!=nil{return}status=resp.StatusCodedeferresp.Body.Close()body,err=ioutil.ReadAll(resp.Body)body=bytes.Trim(body,"\x00")return}funcprocessSiteData(resp[]byte)SiteData{//...}func

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和分化。既然是模拟,所有的分化和

go - reflect.Select 函数是为什么需要的?我假设这是因为 channel 必须是反射值?

什么情况下需要reflect.Select?我找到了示例,但Select的使用似乎是人为的。有没有比普通Select更需要reflect.Select的例子? 最佳答案 有一个write-uprecently来自MongoDB的人。显然这段代码在他们的mongodump实用程序中用于生产。使用reflect.Select的具体代码如下(来自文章)://RunmultiplexeruntilitreceivesanEOFonthecontrolchannel.func(mux*Multiplexer)Run(){for{index,v

go - 是否有更简洁的方法来创建在 channel 上接收后取消的上下文?

我需要调用一个接受Context的函数作为参数。此代码块可以访问用于发出应取消操作信号的channel。这是我目前用来取消Context的方法收到值时:funcdoSomething(stop预期的控制流程如下:如果任务运行完成,它将取消上下文,将触发,goroutine将终止。如果在stop收到一个值,上下文被取消,通知任务它应该退出。当这种情况发生时,goroutine将再次终止。这似乎过于复杂。是否有更简单的方法来完成预期的行为? 最佳答案 正如@ain提到的,如果longRunningFunction运行到最后并且在stop