2017-08-17 6 views
0

私はジョブを処理するjobWorkerを持っていて、この作業者にはデータベース読み書き、ログファイル、受信apiおよびデータ計算があります。golangとのデータ競合作業者を避ける

var mystruct strcut{} 

func worker(v) { 
    Get data from database 
    ... 
    Update database status 
    ... 
    useByWorker() 
    ... 
    Do some computing 
    ... 
    Receive API 
    ... 
    Write log file 
} 

func useByWorker() { 
    mystruct = {1,2,3} 
} 

ここにgo-workerを実行する主な機能があります。

func main() { 
    var wg sync.WaitGroup 
    data := [][]string{} 
    wg.Add(1) 
    for k,v := range data { 
     k := k 
     v := v 
     go func(k int, v []string) { 
      fmt.Println(k,v) 
      worker(v) 
      wg.Done() 
     }(k, v) 
    } 

    wg.Wait() 
} 

データ競合の問題は、作業者に使用されるログと自分のデータが混在するようにします。どのような方法でも、ロックなしでデータ競合の問題を簡単に修正できます(Mutex.Lock)。私は仕事が労働者によってより速く扱われることを望む。

提案やヒントが役立ちます。ありがとう。

+2

'main'にWaitGroupを使用すると、' Add(1) 'を一度呼び出すだけですが、ゴルーチンの' data'の各要素に対して 'Done'を複数回呼び出すだけです。 – ain

+0

「私は仕事がより早く労働者によって処理できるようにしたい。 ---真剣にいくつかのナノ秒でコードの速度を遅くすると思いますか? – zerkms

+0

APIまたはDB応答の待機時に時間が消費されます。この質問の主な問題は、これらの仕事をデータ競争なしに、同時に、かつ、独立してどのようにすべきかということです。 – Weiwei

答えて

1

ファイルへの非ブロック書き込みアクセスを希望する場合は、1つのゴルーチンを使用してファイル通過メッセージをチャネルごとに書き込むことができます。 Channel Buffering またはstandard loggerを使用すると、ブロックを回避できます。それは複数のゴルーチンで動作することができます。

関連する問題