草庐IT

并发控制

全部标签

dictionary - 如何解决Golang map的并发访问?

现在我有一个只有一个写入/删除goroutine和许多读取goroutine的映射,Mapwithconcurrentaccess上有一些解决方案,例如RWMutex,sync.map,concurrent-map,sync.atomic,sync.Value,什么对我来说是最好的选择?RWMutex的读锁有点多余sync.map和concurrent-map专注于许多写goroutine 最佳答案 你的问题有点含糊-所以我会分解它。WhatformofconcurrentaccessshouldIuseforamap?选择取决于您

go - golang 中的复制并发安全吗?

在某些情况下,我会将一些内容复制到slice的不同部分。像这样a:=make([]int,10)fori:=0;i它领先于数据竞赛。但它在产品环境中始终表现良好。所以我的问题是:任何数据竞争云都是未定义的行为吗?在这样的练习中我总能得到正确的结果吗? 最佳答案 为了避免会产生未定义结果的数据竞争,请同步。例如,packagemainimport("fmt""sync")funcmain(){varwgsync.WaitGroupa:=make([]int,10)fori:=0;iPlayground:https://play.gol

go - 从控制台接受一个字符并显示它的下一个字符

我想编写一个程序,从控制台接受一个字符并显示它的下一个字符。这是我尝试过的:packagemainimport("fmt")funcmain(){varchint32fmt.Printf("EnterChar:")fmt.Scan(&ch)ch++fmt.Printf("NextCharis%s",string(ch))} 最佳答案 Go中的“字符”称为runes,rune是int32的别名。您需要进行两项更改:用正确的动词扫描(您的扫描实际上失败了——检查错误!)用正确的动词打印这是一个扩展的例子:packagemainimpor

go - Redigo 并发集导致数据竞争

我正在针对我的redigo函数运行这个测试,看看它是否支持大量并发写入,这是代码import("github.com/gomodule/redigo/redis""log""os")//RedisconnectionpoolvarRedisPool*redis.PoolfuncInitPool(){RedisPool=&redis.Pool{MaxIdle:80,MaxActive:12000,Dial:func()(redis.Conn,error){conn,err:=redis.Dial("tcp","127.0.0.1:6379")iferr!=nil{log.Printf("

concurrency - Golang并发下载死锁

我想在go中并行下载文件,但我的代码永远不会退出:packagemainimport("fmt""io""net/http""os""path/filepath""sync")funcdownload_file(file_pathstring,wgsync.WaitGroup){deferwg.Done()resp,_:=http.Get(file_path)deferresp.Body.Close()filename:=filepath.Base(file_path)file,_:=os.Create(filename)deferfile.Close()size,_:=io.Copy

go - 如何在 Golang 中查找来自控制台的标志数

我正在从控制台传递参数。还有一些旗帜。喜欢:goruntest.go"-IP=10.10.10.10""-db=kite""-wv=45""-cv=75""A=value1""B=value2""C=100""D:=((A-B)/A)*C""D?"这里,-IP,-db,-wv,-wc这四个是flags等据我所知,正在作为正常参数传递。标志的数量可以是可变的。我怎么知道有多少标志传递到我的程序。在这种情况下,传递了4标志。 最佳答案 如果你使用标准的flag包来解析命令行标志,你可以调用NFlag函数来获取标志的数量:packagem

go - 关于goroutine并发的问题

我在goroutine并发方面遇到了一些麻烦。在我的期望中,它应该异步运行并几乎同时打印出来,但它真正做的是等待运行我的测试代码packagemaintypebatchD[]stringvarcBD=make(chanbatchD,6)funcmain(){runtime.GOMAXPROCS(runtime.NumCPU())data:=[][]string{}data=append(data,[]string{"71","40348270","6","win888e","6","1","N","127.0.0.1"})data=append(data,[]string{"71","

go - 初始化/管理并发 SSH 连接

我进行了高低搜索,但我不确定我是否使用了错误的关键字,但我无法理解这一点。我正在构建一个应用程序,它接收主机名列表并通过SSH连接到这些主机名。它旨在维护这些连接(并在断开连接时重新连接)。定期地,我的程序将接受指令并向部分/所有这些主机执行命令。我目前的问题是,我知道你不能初始化一个变量而不使用它,我必须为这些SSH连接动态创建变量,这样我就可以独立监控/管理它们(读/写,必要时重新连接等).由于我对go的了解有限,而且倾向于不小心使事情过于复杂,到目前为止,我想到的最好的方法是使用一个结构并为每个连接及其参数(主机名、用户名、密码、SSH配置详细信息、日志文件)附加位置等)。目前我

go - Zap 记录器打印到控制台和日志文件

我已将Zap与我的go应用程序集成,我们将日志打印在两个日志文件中,我还使用Lumberjack进行日志轮换。但我也试图在控制台中显示日志,但这种情况下运气不好。以下是我在logger.go中的代码var(Logger*zap.LoggerN2n*zap.Logger)typeWriteSyncerstruct{io.Writer}func(wsWriteSyncer)Sync()error{returnnil}funcInitLogging(modestring){varcfgzap.ConfigvarlogName="abc.log"varslogName="n2n.log"ifm

go - 为什么并发不能加速我的斐波那契函数?

这是Go之旅中的以下并发示例packagemainimport("fmt")funcfibonacci(nint,cchanint){x,y:=0,1fori:=0;i我将其修改为不使用goroutines:packagemainimport("fmt")funcfibonacci(nint)int{if(n==0||n==1){return1}x:=1y:=1fori:=0;i然而,在n=100000时,它所花费的时间几乎都是瞬间的。有没有人有goroutines加速计算的例子?我想知道是否有一些编译器设置限制了我的程序可以使用的内核数量。为什么goroutines不能加速计算?