草庐IT

channels_redis

全部标签

go - 在同一功能中使用 channel 发送和接收

如何在同一个函数中创建一个2-waychannel(我不知道这是不是正确的术语)。如果我有以下代码,那么:funcserver(a还有其他实现方法吗?感谢任何帮助。 最佳答案 正如@Warrior评论的那样:在上面提到的代码中,带channel的方向指针限制函数在该channel上执行任何其他事件,而不是允许的事件。所以,制作它:funcserver(achanstring){代替funcserver(a将允许函数通过同一channel发送和接收数据。 关于go-在同一功能中使用chan

go - Go 中缓冲 channel 和非缓冲 channel 之间的测距有什么区别?

我正在尝试类似于以下模式的操作:funcsendFunc(nint,cchanint){fori:=0;i输出看起来是同步的,像这样:PushedPushedPushedPushedPushedPushedPushedPushedPushedPushed0123456789如果我将缓冲channel更改为非缓冲channel:c:=make(chanint)结果似乎是异步的:Pushed01PushedPushed23PushedPushed45PushedPushed67PushedPushed89Pushed为什么它的行为不同?已更新所以我的场景是:在接收者中,每次从生产者接收到新

go - 可执行程序在跨越空 channel 时抢先退出

我最近遇到了一个编码练习,我在python中解决了这个问题,我不得不在其中移植一个“算法”。我不知道它是怎么称呼的,这就是我描述它的原因:每个新行都是对前一行的描述,按顺序打印的相同数字和相关数字的数量。这是一个例子:111211211111221312211etc我开始学习Go及其channel和并发功能。所以我回到这个练习,试图与Go并行更有效地解决它。这是我到目前为止得到的:packagemainfuncmain(){channel:=make(chanuint8)gotreeCalcRoutine(channel,0)channel10{return//returnafter1

go - 在生产者速度慢,消费者速度快的情况下,如何处理 channel 关闭同步?

关闭。这个问题是opinion-based.它目前不接受答案。想改善这个问题吗?更新问题,以便可以通过editingthispost用事实和引文回答问题.3年前关闭。Improvethisquestion我是新手,找不到这个问题的答案。我正在做的是在生产者中读取CSV文件,做一些可能需要时间的事情,然后通过channel将输出发送给消费者。有一连串生产者-消费者s,并且任何生产者最终都可能比它的消费者慢。producer(1goroutine)->chan0->consumer-producer-1(>1goroutines)->chan1->consumer-producer-2(>

去 channel 死锁问题

刚开始学习golang,并没有完全理解死锁是如何产生的。这是一个改编自golangplayground教程的示例:packagemainimport"fmt"funcfibonacci(c,quitchanint){x,y:=0,1for{select{casec为什么上面两行的顺序很重要? 最佳答案 您有两个函数,它们需要同时运行才能使channel通信正常工作-一个必须同时接收另一个发送。在这种情况下:gopp(c,quit)fibonacci(c,quit)您将pp作为goroutine启动,它开始运行,然后您调用fibona

go - 总是与 channel 陷入僵局

我正在学习使用Gochannel,但总是遇到死锁。这段代码可能有什么问题?当数组大小不相等时,打印机随机停止工作;我想以某种方式通知打印机接收器停止工作会有所帮助。任何想法如何解决它?我的代码粘贴在下面。packagemainimport("fmt""sync")varwg=sync.WaitGroup{}varwgs=sync.WaitGroup{}varsg=make(chanint,50)vargp1=make(chanint,50)vargp2=make(chanint,50)funcmain(){wgs.Add(2)goSender(0)goSender(11)wg.Add(

algorithm - 读取和写入同一 channel 的工作池去

我需要你的帮助。目前,我正在尝试创建一个工作池,该工作池从一个channel读取连续的作业,然后将结果生成到它正在读取的同一channel,然后进行工作并将结果生成到同一channel。你的想法有点像递归。有什么办法可以使这成为可能吗?我真的很感激您关于设计模式的建议,以使用go例程作为工作池和channel来实现此解决方案以读取作业,然后从同一工作池将该作业的结果写入同一channel以继续工作。谢谢你。 最佳答案 没有理由不能(从Go的角度)在读取后写回channel:funcFoo(cchanint){x:=虽然这很奇怪……老

struct 中的 Golang channel 表现不同,在创建 struct 时传递它,在创建后通过函数传递

这个问题在这里已经有了答案:Whycan'tIappendtoaslicethat'sthepropertyofastructingolang?(1个回答)Removeanelementofasliceinastruct[duplicate](1个回答)关闭3年前。为了说明问题,我写了一些演示代码。请参阅下面的可运行代码:packagemainimport("fmt""time")typestructOfChanstruct{NamestringsignalChchanbool}func(scstructOfChan)Init(){sc.signalCh=make(chanbool,1

go - Go中的二级缓存(内存+redis)实现

我正在尝试写一个二级缓存(内存+redis),但是当一个key高并发访问时遇到了瓶颈,我尝试对每个key都使用mutex,但是这样增加了cpu很多因为loadFromDB需要100-200毫秒。func(s*Store)GetJsonObjectWithExpire(keystring,objinterface{},ttlint,fStoreLoadFunc)error{//firstreadfrommemoryv,ok:=s.mem.Get(key)ifok{ifv.Outdated(){to:=deepcopy.Copy(obj)gos.updateMem(key,to,ttl,f

go - 确保 Go channel 不阻塞的可靠方法

我正在寻找一种可靠的方法来确保Go中的空channel不会阻止我的执行。我必须以特定顺序(优先级类型)遍历多个channel,一旦我找到一个包含项目的channel,就阅读一个。目前我以类似的方式做一些事情:iflen(myChannel)>0{//Possibleissuehere:lengthcouldhavechangedto0makingthisblockingelm:=从理论上讲,这可能会导致等待时间过长,而不同的channel可能有一个项目已准备好“提供”。有什么改进的建议吗?我可以在channel中使用互斥体,但感觉有更好的解决方案,尽管我不确定如何。