登录
首页 >  Golang >  Go问答

并发实施的挑战

来源:stackoverflow

时间:2024-03-03 16:00:28 267浏览 收藏

大家好,我们又见面了啊~本文《并发实施的挑战》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我很难让 go 并发正常工作。我正在处理从 xml 数据源加载的数据。将数据加载到内存后,我会循环遍历 xml 元素并执行操作。添加并发之前的代码已经过测试并且可以正常运行,我不认为它对并发添加有任何影响。我有两次失败的并发实现尝试,两次都有不同的输出。我使用锁定是因为我不想进入竞争条件。

对于这个实现,它永远不会进入 goroutine。

var mu sync.mutex

    // length is 197k
    for i:=0;i

对于使用waitgroups的这种实现,会出现a运行时内存不足

var mu sync.Mutex
    var wg sync.WaitGroup

    // length is 197K
    for i:=0;i

我不太确定发生了什么,需要一些帮助。


解决方案


  1. 如果您想使其并发,则此处不需要 mutex
  2. 197k goroutine 已经很多了,尝试减少 goroutine 的数量。您可以通过创建 n 个 goroutine 来完成此任务,每个 goroutine 都监听同一个通道。

https://play.golang.org/p/s4e0YyHdyPq

package main

import (
    "fmt"
    "sync"
)

type Listing struct{}

func main() {
    var (
        wg          sync.WaitGroup
        concurrency = 100
    )

    c := make(chan Listing)

    wg.Add(concurrency)
    for i := 0; i < concurrency; i++ {
        go func(ci <-chan Listing) {
            for l := range ci {
                // code, l is a single Listing
                fmt.Printf("%v", l)
            }
            wg.Done()
        }(c)
    }

    // replace with your var
    listings := []Listing{Listing{}}
    for _, l := range listings {
        c <- l
    }

    close(c)
    wg.Wait()
}

以上就是《并发实施的挑战》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>