wait_group
sync.WaitGroupタイプは、セキュリティによって複雑にするだけでなく、箱から出して使用することができています。このタイプの方法、すなわち、3手を持っています、追加完了、および待ちます。
sync.WaitGroupは構造タイプです。前記フィールド数のタイプのバイト配列を表す、このフィールドは、別の4バイト・カウントを待って、所定の数の4バイトで表されます。変数はsync.WaitGroupタイプ宣言されると、前記これら2つのカウントが0になります。これは例えば、与えられたカウントaddメソッドによって増減することがあります。
wg.Add(3)
若しくは
wg.Add( - 3)
私たちは、このカウント値が負の数になり任せることはできないことに注意してください。
wg.Done()
等価に
wg.Add( - 1)
私たちは、この方法が変更に行われ、カウンタの値を追加しますが、どのような具体的な役割は、それの後に変更することができることをご存知ですか?
待機方法sync.WaitGroup型の値を呼び出すとき、それは与えられた数をチェックします。カウントが0の場合、メソッドはすぐに戻り、プログラムへの影響はありません。カウンタが0より大きい場合は、この方法は、カウンタを待っがインクリメントされている間、それはブロックすることゴルーチンを呼び出します。完了追加または方法までを0に与えられたカウントバックの値が呼び出されたときに、この値は、したがって、ウェイクアップするために待機するとウェイト数をクリアしながら、すべてのゴルーチンを阻止しました。
今、私たちはケースを持っている:と仮定プログラムは4ゴルーチン、それぞれG1、G2、G3、G4を可能にしました。どのG2、G3、G4は、G1のコードで有効化され、G1が有効になっており、その後、これらの特別なタスクの完了を待つています。
ブロッキングのための使用チャネル
記号:=メイク(チャンINT、3 ) FUNC行く(){ 記号 < - 2 fmt.Println(2 ) }() ゴーFUNC(){ 記号 < - 3 fmt.Println(3 ) }() (FUNCを行きます) { 記号 < - 4 fmt.Println(4 ) }() のための I:= 0 ; I < 3。I ++ { fmt.Println(" 执行"、< - 符号) }
チャネルを使用して、あまりにも重く、原則的に、我々は、使用するミューテックスやセマフォとしてチャネルではないはずです。
使用waitGroup
VAR sync.WaitGroup WG wg.Add(3 ) 移動FUNC(){ wg.Done() fmt.Println(2 ) }() 行くFUNC(){ wg.Done() fmt.Println(3 ) }() 外出FUNC(){ wg.Done() fmt.Println(4 ) }() wg.Wait() fmt.Println(" 1 2 3 4末端")
参考:同時は本物になって行きます