草庐IT

Concurrency

全部标签

go - 解决 goroutines 死锁

我一直在尝试解决我在Golang并发中遇到的这个简单问题。我一直在搜索所有可能的解决方案,但没有发现任何特定于我的问题(或者我可能会错过一个)。这是我的代码:packagemainimport("fmt""time")funcproducer(chchanint,dtime.Duration,numint){fori:=0;i它打印错误:fatalerror:allgoroutinesareasleep-deadlock!goroutine1[chanreceive]:main.main()D:/Code/go/src/testconcurrency/main.go:23+0xcaex

go - 如何通过检查 Golang 来解决此迭代?

我有一些Golang代码,如下所示packagemaintypeMyStructstruct{field1stringfield2float64field3intfield4bool}funcmain(){names:=getNames()myStruct:=getMyStruct(names)writeToCsv(myStruct)}funcgetNames()[]string{//getlistofnamesthenreturn}funcgetMyStruct(names[]string)[]Mystruct{myStruct:=[]MyStruct{}fori:=rangenam

multithreading - 在 Go 中关闭自馈 channel

我正在尝试使用Go中的并发和channel。我面临的问题主要是并发的想法,所以我不认为以下逻辑是错误的或者应该改变。我有一个缓冲区大小为“N”的缓冲channel,它还代表将要创建的goroutine的数量。所有例程都从一个channel读取并写入另一个channel,主goroutine将打印来自最终channel的值。1个输入channel---N个goroutines查找并添加到输入和输出---1个输出channel问题是我总是遇到死锁,因为我不知道如何关闭一个正在self馈送的channel,也不知道它什么时候会停止,所以我也无法关闭输出channel。代码如下:package

go - 在没有锁的情况下并发读取函数指针是否安全?

假设我有这个:gofunc(){forrangetime.Tick(1*time.Millisecond){a,b=b,a}}()其他地方:i:=a//对于这个问题,i相对于原始a或b的值是什么并不重要。唯一的问题是阅读a是否安全。也就是说,a是否有可能为nil、部分分配、无效、未定义……除有效值之外的任何值?I'vetriedtomakeitfail但到目前为止它总是成功(在我的Mac上)。我无法在TheGoMemoryModel中找到除此引用之外的任何具体信息文档:Readsandwritesofvalueslargerthanasinglemachinewordbehaveasm

go - 如何使变量成为线程安全的

我是Go的新手,我需要创建一个线程安全的变量。我知道在Java中您只能使用synchronized关键字,但是go中似乎不存在这样的内容。有什么方法可以同步变量? 最佳答案 Java中的synchronized是仅允许单个线程(在任何给定时间)执行代码块的方法。在Go中,有许多构造可以实现该目标(例如mutt,channel,waitgroups,sync/atomic中的原语),但是Go的谚语是:“不要通过共享内存进行通信;而是通过通信来共享内存。”因此,与其锁定和共享变量,不如不要这么做,而要在goroutines之间传递结果,

concurrency - sync.WaitGroup 不等待

可能是我看不到明显的东西,我做错了什么:funcprintSize(listOfUrls[]string){varwgsync.WaitGroupwg.Add(len(listOfUrl))for_,myurl:=range(listOfUrls){gofunc(){body:=getUrlBody(myurl)fmt.Println(len(body))wg.Done()}()}wg.Wait()}如果我删除wg并继续,我会正确收到每个url正文的大小。如果我像上面那样做,它几乎会立即打印出零。getUrlBody()有时需要几分钟才能执行。回答评论:可以肯定的是,我也以这种方式尝试

go - 为什么goroutine会暂停几分钟

我有一个用GO编写的任务,用于从AWSS3读取.gz文件,每个.gz文件的大小为20M。每个goroutine会从s3下载一个.gz文件到本地磁盘,然后通过gzip.NewReader逐行读取它的内容。当task(goroutine)计数超过70时,67个goroutine将成功完成它们的操作。但是剩下的goroutine将被暂停几分钟。暂停的那一刻,我看到CPU是100%,然后,CPU会降到0.2%(4CPU,16G内存)并停留几分钟。问题:我很困惑,为什么goroutines在CPU很低的时候什么都不做?这可能是什么原因造成的?Testresults:60goroutines,it

multithreading - 阅读缓存DIY书时的一个Go map线程安全问题

我正在读一本书,它教我如何编写像Redis这样的简单缓存。以实现分布式哈希为目标,项目必须有key迁移,这需要一个迭代器。而且我认为可能存在一些问题。他的书是关于迭代map的,但是在迭代的同时,读取锁的保持不是连续的。原因是尽量不影响主缓存进程。我相信一定存在线程安全问题,因为主缓存线程仍在写入映射。我写了一个演示,但不确定。//bookcodetypeinMemoryScannerstruct{pairpairChan*paircloseChchanstruct{}}func(c*inMemoryCache)NewScanner()Scanner{pairCh:=make(chan*

go - 运行固定数量的 goroutines

我不完全确定这里发生了什么,所以很难概括我的问题,但我会尽力而为。在几年前的一段视频中,马特·帕克(MattParker)鼓励他的观众找出2的幂,其中不包含任何2的幂的数字。(例如,2^16=65536。这些数字都不是2的幂)。最近我开始学习Go,我认为这将是一个很好的入门练习来习惯这门语言。我很快就创建了这个,然后我决定尝试让它并发以充分利用我的四核处理器。这是事情走下坡路的地方。此处的目标是运行恒定数量的goroutine,每个goroutine处理不同批处理的数字。我是这样实现程序的:packagemainimport("log""math/big""runtime")//The

go - 如何分别从服务器上运行的两个并发进程接收数据?

我正在尝试构建一个基本的客户端/服务器架构,其中两者之间有一些数据交换,并且双方都有一些处理。所以我的服务器有两个线程正在向客户端发送一些数据。我想知道如何将这些数据分别接收到两个不同的变量中。我了解到,尽管我仍然不确定,这与竞争条件、互斥锁等概念有关。我对它们有一个基本的了解,但从未实际使用过它们。我想知道关于这个问题是否有一些预先设计的解决方案。服务器端:funchandleConn(connnet.Conn){gofunc(){io.WriteString(conn,"Text1")}()gofunc(){io.WriteString(conn,"Text2")}()}客户端:f