草庐IT

TIM_CHANNEL

全部标签

memory-leaks - channel 和内存泄漏

我正在尝试开发一个连续运行的程序。它应该每隔sleepPool秒从数据库中提取一些数据,并以非阻塞方式“处理”信息(至少这是我正在尝试做的)。问题是内存不断增长,所以我想知道我是否做错了什么。下面是我的程序的一个片段。varuCh=make(chan*user,buffLimit)//emitsnewuserstoprocessvarstatsCh=make(chan*user,buffLimit)//emitsnewuserstostorefuncmain(){goemitUser(db)goconsumeUser(db)forur:=rangestatsCh{log.Infoln(

go - 阅读 channel 作为 if 语句的条件是一种好习惯吗?

我见过几个这样的例子:typedatastruct{requestchanstringresponsechanbool}并像这样使用:db:=&data{make(chanstring),make(chanbool)}ifdb.request来自响应channel的“轮询”是否不阻塞?有时在channel的另一端响应之前是否会评估if条件?这种模式是否在标准库中的任何地方使用过? 最佳答案 你没有轮询任何东西,是的,channel接收操作总是可以阻塞。是一个正常的接收操作。db.responsechan必须是chanbool,和!是

go - 更新未读 channel 数据

有没有办法用更新的数据更新发送到channel的未读数据?我有一个goroutine(生产者),它有一个channel,可以向另一个goroutine(消费者)提供进度更新。在某些情况下,进度的更新速度可能比消费者消耗更新消息的速度快得多。这会给我带来一些问题:阻止向channel发送数据。这意味着,如果消费者读取数据的速度很慢,则更新goroutine的进度会完全阻塞——这是不应该的。不要阻止发送并在channel已满时跳过进度更新。这意味着消费者总是在读取旧的、过时的数据。举个例子,我可能有这样的东西:进度报告goroutine:将“1%”发布到channel进度报告gorouti

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