草庐IT

phoenix-channels

全部标签

go - 什么时候应该在 channel 上使用互斥体?

在过去的几周里,我一直在努力解决一个(不太)简单的问题:什么时候最好使用sync.Mutex,相反,什么时候最好使用chan?似乎对于很多问题,两种策略都可以互换-这就是问题所在!取thisvideo在Golang文档中找到。下面,我冒昧地在playground中口述代码,并将其转换为等效的sync.Mutex。在现实世界中是否存在某个问题需要使用另一个?注意事项:我是thisuseofchan的忠实粉丝并努力想出使用sync.Mutex的更优雅的实现方式。值得注意的是,chan实现同时执行更多工作(达到12个)*Playground:ChanimplementationMutexim

go - goroutine 泄漏是否会发生在具有一个缓冲区且具有两个输入但只有一个输出的 channel 中?

我有一个函数用于在两个io.ReadWriter之间转发消息秒。一旦发生错误,我需要记录错误并返回。但我认为我的代码中可能存在goroutine泄漏问题:functransport(rw1,rw2io.ReadWriter)error{errc:=make(chanerror,1)//onlyonebuffergofunc(){_,err:=io.Copy(rw1,rw2)errc因为这个函数只能捕获一个error,那么第二个goroutine会不会正常退出垃圾回收呢?或者我应该再写一篇err收到另一个错误。 最佳答案 来自一个协程

go - 检查 channel 的值(value)

我有两个只读channel用作发电机。typeEventstruct{timeint}我可以将它们的值读作:for{select{case我将这些channel用于事件驱动模拟,因此我必须选择Event用少timefield。是否可以检查每个channel的值,然后才选择从哪个channel读取?因为操作从channel中获取值(value),并且不可能将其推回(只读channel)。 最佳答案 您可以实现您的版本的gochannel结构。例如下面的实现就像没有大小限制的gochannel一样,你可以检查它的第一个元素。packag

Golang channel 睡着了

我是golangchannel的新手,无法低估为什么如果我指定channel缓冲区大小程序行为会发生变化packagemainimport("fmt")funcchannels(in10{fmt.Println("Sendclose")in输出是:OutOut11OutOut11OutOut11OutOut11OutOut11OutOut1Sendclosefatalerror:allgoroutinesareasleep-deadlock!goroutine1[chansend]:main.main()/home/user/go-lessons/3/chan_4.go:39+0x2c

go - 将 channel 参数传递给 golang 中的动态加载函数

我是golang和golang插件的新手。我无法将chan对象传递给此函数。如果我切换到int它会起作用。不确定我到底错过了什么。感谢您的帮助。dataunit.gopackagemaintypeDataUnitstruct{iintsstring}modcounter.gopackagemainimport("fmt"//"strconv")typemodulestring//func(mmodule)RunMod(iint){func(mmodule)RunMod(inmodmain.gopackagemainimport("fmt""os""plugin")typeDataUni

Golang 多 channel 写/接收排序

我的具体问题是我有一个无缓冲的channel,并且正在生成多个与信号量绑定(bind)的goroutines来执行工作:funcmain(){sem:=make(chanstruct{},10)//allowtenconcurrentparserswg:=&sync.WaitGroup{}wg.Add(1)DoSomething("http://example.com",sem,wg)wg.Wait()//alldone}funcDoSomething(ustring,semchanstruct{},wg*sync.WaitGroup){deferwg.Done()sem如果堆栈上有多

go - channel 以裸返回方式返回时为零

我花了相当多的时间来尝试调试为什么我的channel不接受任何内容。我设法将问题定位为与命名返回值的范围相关的问题,当它们以裸返回的形式返回时。下面的代码显示了问题。packagemainimport("log""sync")varreceiverchanintfuncSetup()(receiverchanint){receiver=make(chanint)return}//funcSetup()(chanint){//receiver=make(chanint)//returnreceiver//}funcLaunch(jint){fori:=0;i运行这段代码会产生下一个错误f

go - 信号 goroutines 在 channel 关闭时停止

我有多个从两个channel选择的goroutines:一个channel提供数据,一个channel用于信号(一种完成/退出channel)。我使用信号channel来捕获信号(杀死)并优雅地关闭goroutine。我从packagea运行“worker”协程,而捕获信号的goroutinefunc从packageb运行。我使用来自https://gist.github.com/reiki4040/be3705f307d3cd136e85的信号包.packageaimport"sync"WorkChan:=make(chanint)QuitChan:=make(chanstruct{

concurrency - 使select语句同时等待多个 channel

引用自TheGoProgrammingLanguageSpecification:A"select"statementchooseswhichofasetofpossiblecommunicationswillproceed.Itlookssimilartoa"switch"statementbutwiththecasesallreferringtocommunicationoperations.如何在case子句中等待多个channel,以便仅当两个channel都返回时才执行case?示例:select{case 最佳答案 没有

使用 channel 进行管道

我正在探索Go并尝试使用channel建立一种管道。我只想在main()中读取一些内容并将它们发送到process()进行处理,在这种情况下,只需将值打印到屏幕上即可。不幸的是,在下面的代码中,process()似乎从来没有从channel中读取过,或者至少它没有打印任何东西;我做错了什么?packagemainimport("fmt";"database/sql";_"github.com/lib/pq";"time";"gopkg.in/redis.v3")//;"strconv")typeRecordstruct{userId,myDateintprodUrlstring}fun