草庐IT

channel1

全部标签

go - 单个 channel 上的多个接收器。谁得到数据?

无缓冲channel会阻塞接收器,直到channel上有数据可用。我不清楚这种阻塞如何与同一channel上的多个接收器(例如在使用goroutines时)一起表现。我敢肯定,只要该channel上没有发送数据,它们就会全部阻塞。但是,一旦我向该channel发送一个值,会发生什么?哪个接收器/goroutine将获取数据并因此解除阻塞?他们全部?排第一?随机? 最佳答案 一个随机(非确定性)的人会收到它。查看语言spec:Executionofa"select"statementproceedsinseveralsteps:For

go - golang中定期刷新 channel

我需要定期刷新channel的内容。我用len()做到了这一点,我想知道是否有更好的方法来做到这一点。http://play.golang.org/p/YzaI_2c_-Fpackagemainimport("fmt""math/rand""time")funcmain(){commch:=make(chanint,100)gofillchan(commch)drainchan(commch)}funcfillchan(commchchanint){for{select{case编辑1:似乎这是更好的方法http://play.golang.org/p/4Kp8VwO4ylpackag

clojure - 为什么 CSP 实现只涵盖 channel ?

在关于CommunicatingSequentialProcesses的书中大量时间花在定义事件上,这些事件没有方向,可能涉及多个独立的过程。仅在第4章介绍了channel,有针对性,涉及2个过程。然而,包括occam、Go、LuaCSP和clojure.core.async在内的所有CSP实现都只实现了channel。尽管大多数实际问题都可以通过(广播)channel解决,但我想知道为什么这本书会花这么多时间在这些问题上,而没有人使用它们。 最佳答案 首先是本书happenedbefore实现。因此,您的问题最好表述为:Whydo

go - 为什么 channel 类型中有一个 '<-'?

这行得通。vartick但事实并非如此。vartickchantime.Time=time.Tick(1e8)为什么我需要在我的channel类型声明中?我以为用于写入或读取channel。为什么会出现在一个类型中? 最佳答案 channel可以有一个类型来指示它是只读的、只写的还是两者兼有。指示channel方向是用所以在是类型的一部分,chantime.Time//Wouldbearead/writablechannelchan和time.Tick(1e8)返回一个只读channel。阅读更多语言规范here

java - Go channel vs Java BlockingQueue

Gochannel和JavaBlockingQueue之间有什么区别吗?两者都是具有相似阻塞和内存模型语义的队列。(可选)两者都可以设置容量。 最佳答案 我想说最大的区别是Gochannel支持select语句,它允许您只执行一个channel操作。一个示例(由Golanguagespecification更改):select{casei1=在此示例中,将执行从c1接收、发送到c2或从c3接收操作中的一个。进入选择时,会随机选择一个就绪channel(如果有)。否则,操作会阻塞,直到其中一个channel准备好。我不知道使用Java

go - 为什么 Go 在写入封闭 channel 时会感到 panic ?

为什么Go在写入已关闭的channel时会出现panic?虽然可以使用value,ok:=用于从channel读取的习惯用法,因此可以测试ok结果是否命中关闭的channel://readingfromclosedchannelpackagemainimport"fmt"funcmain(){ch:=make(chanint,1)ch输出:read2fromchannelchannelisclosedchannelisclosed在Playground上运行“从封闭channel读取”写入可能已关闭的channel更加复杂,因为如果您只是在channel关闭时尝试写入,Go会出现pan

concurrency - 是否可以将多个 channel 复用为一个?

这个想法是在一个slice中拥有可变数量的channel,将通过它们接收到的每个值推送到单个channel中,并在最后一个输入channel关闭后关闭此输出channel。像这样,但对于两个以上的channel:funcmultiplex(cin1,cin2,coutchanint){n:=2for{select{casev,ok:=上面的代码避免了忙循环,因为没有default情况,这很好(编辑:看起来“,ok”的存在使得选择语句非阻塞,循环是毕竟很忙。但是为了这个例子,把代码想象成它会阻塞)。是否也可以通过任意数量的输入channel来实现相同的功能?显然,这可以通过将slice成

go - 我们如何在 Go 中使用 channel 来代替互斥锁?

channel将通信(值的交换)与同步相结合,确保两个计算(goroutine)处于已知状态。如何使用GoogleGo中的channel来执行互斥锁的功能?packagemainimport"sync"varglobalint=0varmsync.Mutexfuncthread1(){m.Lock()global=1m.Unlock()}functhread2(){m.Lock()global=2m.Unlock()}funcmain(){gothread1()gothread2()} 最佳答案 将Channel用作Mutex的示例

去 channel 和死锁

我正在尝试理解Go语言。我试图创建两个goroutine使用两个channel链接它们之间的流:funcmain(){c1:=make(chanint)c2:=make(chanint)gofunc(){fori:=rangec1{println("G1got",i)c2正如预期的那样,这段代码会打印出来:G1got1G2got1G1got1G2got1....直到主函数退出。但是如果我从主channel向其中一个channel发送另一个值,它会突然阻塞:funcmain(){c1:=make(chanint)c2:=make(chanint)gofunc(){fori:=rangec

go - 是否可以在 Go 中同时等待 channel 和文件描述符?

我知道我可以在Go中使用select{}语法等待多个channel,并使用syscall.Select()或类似函数等待多个文件描述符。但是是否可以同时在两个channel上等待?作为背景,我希望有一个goroutine通过channel接受消息并通过套接字连接(由gozmq提供)转发它们,同时等待套接字连接的回复。由于底层库的线程安全要求,一次只能在一个线程中访问套接字,这就是为什么我想知道是否有一种方法可以从单个goroutine处理这个问题。 最佳答案 无法同时选择channel和文件描述符,因为抽象处于不同的级别。chann