2017-08-18 28 views
0

2つのルーチン関数があります.1つはデータを作成し、もう1つはデータをデータベースに追加します。データの作成が終了したら、データの追加を終了したいが、関数を何回呼び出すのか分からない。すべてのゴルーチンが終了したときにプログラムを終了する

for { 
    select { 
    case c <- dataChan: 
    go func() { 
     if data == false { 
     return // keeps the program running but never exits 
     } 
     createData(c.Data) // sends data to dataChan until data == false 
    } 
    go func() { 
     addData(c.Data) // need to keep the program running until all these goroutines finish 
    } 
    } 
} 

createData()が作成され、dataChanにデータを送信し、それが最終的に何度も何度も返すことによって開放状態に保持されるようにfalsedataを設定し、プログラムの原因になりますいくつかの変数に基づいており、より多くのデータを作成停止しますが、私は感じますすべてのaddData()のgoroutinesが終了したら私が終了することを可能にするよりクリーンな方法があるはずです。私は人々がこれにチャネルを使用しているのを見ましたが、関数を呼び出す回数を正確にはわかりません。

UPDATE:WORKING CODE

var wg sync.WaitGroup 
for { 
    select { 
    case c <- dataChan: 
    wg.Add(1) 
    go func() { 
     if data == false { 
     wg.Wait() 
     os.Exit(0) 
     } 
     createData(c.Data) 
    } 
    go func() { 
     addData(c.Data) 
     defer wg.Done() 
    } 
    } 
} 

答えて

5

sync.WaitGroupあなたがここに欲しいものです。あなたはそれぞれのゴルーチンを開始する前にwg.Add(1)(またはカウントアップがわかっている場合はwg.Add(n))、終了時には各ルーチンにwg.Done()mainにはwg.Wait()がすべて終了するまで待つ必要があります。リンクされたドキュメントには例があり、ドキュメントノートでは、コピーすることで目的のものはできません。変数をポインタ(wg := new(sync.WaitGroup))にすることができます。

関連する問題