Неудачные попытки реализации параллелизма - PullRequest
0 голосов
/ 05 мая 2019

Мне трудно заставить параллельный параллелепипед работать правильно. Я работаю с данными, загруженными из источника данных XML. Как только я загружаю данные в память, я перебираю элементы XML и выполняю операцию. Код до добавления параллелизма был протестирован и функционален, и я не думаю, что он влияет на добавление параллелизма. У меня есть 2 неудачные попытки реализации параллелизма, оба с разными выходами. Я использовал блокировку, потому что я не хочу входить в условия гонки.

Для этой реализации он никогда не входит в программу.

    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()     
      }()
    }

Для этой реализации с использованием waitGroups, a runtime out of memory occurs

    var mu sync.Mutex
    var wg sync.WaitGroup

    // length is 197K
    for i:=0;i<len(listings.Listings);i++{
       wg.Add(1)
       go func(){
           mu.Lock()

           // code execution (tested prior to adding concurrency and locking and wait group)      

           wg.Done()
           mu.Unlock()   
       }()
    }
    wg.Wait()

Я не совсем уверен, что происходит, и мог бы использовать некоторую помощь.

1 Ответ

1 голос
/ 05 мая 2019
  1. Вам не нужно Mutex здесь, если вы хотите, чтобы это было одновременно
  2. 197K гороидов много, попробуйте меньшее количество горутин.Вы можете сделать это, создавая N подпрограмм, когда каждая из них слушает один и тот же канал.

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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...