草庐IT

channel1

全部标签

go - 通过 channel 在 Go 中进行通信

考虑这样的情况。有一个主要的goroutine和十个附属的协程。他们都可以访问channel。主发送1000号码到这个channel,从属的将从中读取。是否可以保证每个子goroutine将恰好读取100个数字,或者这个数量可能会有所不同,例如某些goroutine将读取99个数字,而另一个goroutine将读取101个数字? 最佳答案 不,不能保证,因为它取决于每个goroutine的运行时间,而这取决于goroutine在CPU中的分布情况。 关于go-通过channel在Go中进

具有无缓冲 channel 的 Golang 例程

我正在阅读Goinaction这本书。无缓冲channel是这样描述的:Anunbufferedchannelisachannelwithnocapacitytoholdanyvaluebeforeit’sreceived.Thesetypesofchannelsrequirebothasendingandreceivinggoroutinetobereadyatthesameinstantbeforeanysendorreceiveoperationcancomplete.Ifthetwogoroutinesaren’treadyatthesameinstant,thechannel

go - 没有收到来自 channel 的消息

编辑:在我添加了我正在使用的一小部分文件(7GB)并尝试运行该程序后,我可以看到:fatalerror:allgoroutinesareasleep-deadlock!goroutine1[chanreceive]:main.main()/media/developer/golang/manual/examples/sp/v2/sp.v2.go:71+0x4a9exitstatus2情况:我是GO的新手,所以如果我的问题真的很简单,我很抱歉。我正在尝试流式传输xml文件、拆分文档,然后在不同的GO例程中解析它们。我正在使用的XML文件示例:我有这段代码:packagemainimpor

csv - 为一个 channel 使用多个接收器

我正在尝试使用go-json-rest在golang中编写REST服务该服务的目的只是将接收到的数据转换为CSV并记录下来。由于负载可能很重,我想使用goroutines进行日志记录。目前我已经创建了四个LogWorker(goroutine)每个goroutine都会将CSV记录到单独的文件中。当我执行代码时,日志总是从最后一个goroutine触发。我看到在我的日志文件夹中创建了一个来自第四例程的文件。这是我的服务器代码packagemainimport("github.com/ant0ine/go-json-rest/rest""log""net/http""strconv""t

go - 阅读 channel 的不同方式

我很好奇为什么从channel读取值的不同方式会导致不同的行为。提供代码:mychan:=make(chanint)gofunc(){i:=0for{mychangoroutine无限地将一个整数序列“流”到mychanchannel。在这段代码之后,如果您直接使用阅读像这样:fmt.Println(这会按预期打印“0”。如果你不断重复,它就会继续阅读:fmt.Println(但是,使用循环机制,它会无限阻塞。fori:=rangemychan{fmt.Println(i)}也就是说这个机制只能从一个封闭的channel中读取,对吧?但是,使用select方法,事情变得更奇怪了:for

转到 : Deadlock issue with go channel and select

我已经在golang中实现了一个演示tcp聊天服务器,它工作正常,但每次用户断开连接时,我都会尝试向广播channel写入一条消息,让其他用户知道用户已断开连接,它会阻塞,并且会不再处理来自其他客户端的任何新消息,因为它是一个非缓冲channel我已经按代码注释和解释了你可以通过它,我不知道为什么代码块,我写了消息我要写信给channel我已经给channel写信了我已从channel阅读而且消息都井井有条,但我的消息channel仍然阻塞。Ps:如果我使用缓冲channel,代码不会阻塞,但我想知道我的代码在哪里卡住了。我还尝试使用-race标志运行我的代码,但没有帮助package

使用 channel 时 goroutines 死锁

我是golang的新手,我正在尝试编写一个使用goroutine的简单递归算法。我正在使用channel从goroutine接收输出,但是当我尝试这样做时,我收到“fatalerror:所有goroutines都睡着了-死锁!”错误。如果我注释掉channel代码,一切都运行良好。这是我的代码:packagemainimport("fmt""sync")funcmain(){numbers:=[]int{2,-1,10,4,3,6,22}ch:=make(chan[]int)wg:=&sync.WaitGroup{}wg.Add(1)gotestFunc(numbers,ch,wg)w

go - 是否关闭 channel block 直到接收者读取它

我已经实现了一种通过关闭channel来关闭我的服务器的方法,因此其他goroutine读取关闭的channel然后退出。关闭后,我需要对服务器数据做一些清理,如果close()阻塞直到所有其他goroutine读取关闭的channel,我可以无锁地访问数据。所以问题是:关闭channel是否会阻塞直到接收者从中读取?下面是示例代码:packagemaintypeserverstruct{chStopchanstruct{}datamap[int]interface{}}funcnewServer()*server{return&server{chStop:make(chanstruc

go - 在 Go 中使用输入和输出 channel

我正在尝试使用channel将数据传入和传回go例程。在执行过程中的某个时刻,进程会卡住。我无法通过Delve确定何时或为何。我到底做错了什么?funchandler(whttp.ResponseWriter,r*http.Request){records:=liaison.Parse(r)//ParseincomingJSONintoaslice.nRecords:=len(records)in,out:=make(chanmap[string]string),make(chanmap[string]string)//StartagoroutineforeachCPUcore.for

go - 多个 goroutines 和一个 channel 的死锁

我有一个无法解决的死锁问题。我拥有一些url,goroutine中的每个url都会给我带来足够的数据。我将这些数据放入单个channel中。但是,如果我关闭channel,程序将无法运行,如果我让channel保持打开状态,则会出现死锁。不知道怎么解决,求大神解答下面我把问题简化一下packagemainimport("fmt")typeurlNumbersstruct{urlstringnumbers[]int}funcgetNumbers(urls[]urlNumbers)chanint{ch:=make(chanint)for_,url:=rangeurls{goallNumbe