并发尝试失败

时间:2019-05-04 23:58:11

标签: go concurrency

我很难获得并发性才能正常工作。我正在处理从XML数据源加载的数据。一旦将数据加载到内存中,就循环遍历XML元素并执行操作。并发添加之前的代码已经过测试并且可以正常工作,我认为它对并发添加没有任何影响。我在并发实现上有2次失败尝试,但均输出不同。我使用锁定是因为我不想输入竞争条件。

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

Weekday(<date>, [<optional vbDayOfWeek>])

对于使用waitGroups的实现, var mu sync.Mutex // length is 197K for i:=0;i<len(listings.Listings);i++{ go func(){ mu.Lock() // code execution (tested prior to adding concurrency and locking) mu.Unlock() }() }

a runtime out of memory occurs

我不太确定这是怎么回事,可以使用一些帮助。

1 个答案:

答案 0 :(得分:1)

  1. 如果要使其并发,则不需要Mutex
  2. 19.7万个goroitines数量很多,请尝试使用较少数量的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()
}