草庐IT

Routines

全部标签

go - 将来自多个 go routines 的响应获取到一个数组中

我需要从多个go例程中获取响应并将它们放入一个数组中。我知道channel可用于此目的,但我不确定如何确保所有go例程都已完成结果处理。因此,我正在使用WaitGroup。代码funcmain(){log.Info("Collectingints")varresults[]int32for_,broker:=rangee.BrokersByBrokerID{wg.Add(1)gogetInt32(&wg)}wg.Wait()log.info("Collected")}funcgetInt32(wg*sync.WaitGroup)(int32,error){deferwg.Done()/

go - 多个 go routines 从一个 channel 消耗导致数据丢失

我是Go的新手。在我下面的例子中,多个goroutines从一个无缓冲的channel中消耗。代码:varc=make(chanint)funcf(){forval:=rangec{fmt.Printf("routine1:%v\n",val)}}funcg(){fmt.Printf("routine2:%v\n",输出是:routine1:0routine1:2routine2:1routine1:3routine1:4这里缺少值5,并且永远不会打印!为什么会这样?如果我删除调用-gog(),它会完美运行。此外,如果我使channel缓冲,请说:varc=make(chanint,1

concurrency - 所有 go routines 都睡着了 - 死锁

我正在使用Go构建工作系统的框架,但我收到“fatalerror:所有goroutines都在sleep-死锁!”。我使用两个channel进行协调,一个用于创建工作,第二个用于发送结果。创建作业后,我关闭输入channel。我的问题是如何关闭输出channel以便程序可以正确退出。代码是:packagemainimport("bufio""flag""fmt""log""math/rand""os""time")typeWorkstruct{idinttstime.Duration}const(NumWorkers=5000NumJobs=100000)funcworker(inbe

go - 为什么当我有两个 go-routines 时循环代码不执行

我在golang中遇到问题vara=0funcmain(){gofunc(){for{a=a+1}}()time.Sleep(time.Second)fmt.Printf("result=%d\n",a)}预期:结果=(一个大整数)结果:结果=0 最佳答案 你有一个竞争条件,使用-race标志运行你的程序gorun-racemain.go==================WARNING:DATARACEReadat0x0000005e9600bymaingoroutine:main.main()/home/jack/Project

Go Routines 有时有效,有时会出现关闭 channel 错误

我是Go的新手,我正在尝试了解并发模式。当我运行以下代码时,有时会得到预期的结果(从0到9999的完整数字数组)。其他时候,我只是收到一条显示时间的“就是这样”的消息。有时我只会收到“在关闭的channel上发送”错误。这里可能出了什么问题?packagemainimport("fmt""time""sync")funcJobsDispatcher(inchanint,data[]int){for_,value:=rangedata{in 最佳答案 这个很简单。这就是为什么你从不在goroutine中使用WaitGroup的Add。

testing - 如何测试 Golang channel /go-routines

我有一个包含一个字节数据的类型,并使用一个channel将新数据发布到那里。其他代码可以使用Read函数读取最后写入的数据字节。编辑:对于实际的可运行代码,请参阅https://github.com/ariejan/i6502/pull/3特别是文件acia6551.go和acia6551_test.go。测试结果可以在这里查看:https://travis-ci.org/ariejan/i6502/jobs/32862705我有以下内容://Emulatesaserialinterfacechipofsomekind.typeUnitstruct{//Channelusedforot

go - Go Routines 及其并发问题

TL;DR接受并连接两个独立的SETS连接。想用RPC并发完成。我正在尝试在我的计算机上创建半分布式系统。我现在正在处理的这段代码有点像代理节点,换句话说,它总是从一个端口接受客户端连接。它还不断地接受来自不同端口的后端节点连接。我正在尝试找到一种方法来同时倾听两者并为两者提供服务。我正在使用RPC,我尝试这样做的方式是这样的:主要:funcmain(){...rpc.Register(myInterface)l,err:=net.Listen("tcp",client_port)iferr!=nil{...}gohandleClients(l)node_l,err:=net.List

testing - 如何着手测试 go routines?

此问题的一个示例是当用户创建资源并删除资源时。我们将执行该操作并增加(减少)计数器缓存。在测试中,有时会出现计数器缓存未被go例程更新的竞争条件。编辑:抱歉造成混淆,澄清一下:计数器缓存不在内存中,它实际上是数据库中的一个字段。竞争条件不是内存中的变量,实际上是goroutine写入数据库本身可能很慢!我目前在操作后使用1秒休眠,以确保在测试计数器缓存之前计数器缓存已更新。有没有另一种方法可以测试go例程,而无需任意1秒sleep来等待go例程完成?干杯 最佳答案 Intesting,thereissometimesaracecon

go - 在 go routines 中更改目录

我正在尝试将go例程中的目录更改为目录x。我现在想使用一个不同的go例程将目录更改为目录y。我的第一个go例程的执行是否会受到第二个go例程中对当前工作目录的更改的影响?想要这样做的目的是在做类似任务时引入并行性。如果它最终改变了CWD,应该有什么替代方法(fork...)? 最佳答案 如评论中所述,在每个goroutine中跟踪当前工作目录会导致问题。尝试使用filepath.Abs捕获绝对目录并存储它。然后每个goroutine都可以在它自己的目录上运行,而不用担心它在后台被“切换”。只要确保您没有被多个goroutine意外修

go - 为什么 time.Sleep(2) 不能与 go routines 一起工作?

来自此处的例程示例:https://gobyexample.com/goroutines,为什么用time.sleep(2)替换fmt.Scanln代码不起作用?如果将最后三行替换为time.Sleep(2),则go例程不会打印任何内容。funcmain(){f("direct")gof("goroutine")gofunc(msgstring){fmt.Println(msg)}("going")time.Sleep(2)} 最佳答案 time.Sleep需要time.Duration作为参数,以纳秒为单位。如果你想要秒,使用ti