[移動]簡単な仕事のプールを達成するためのチャネルを使用して

ゴルーチン最初の開始の固定数は、チャネルが空の場合、ブロックが待機し、チャネルからデータを得るために各ゴルーチン
チャネルが経過実行する特定のタスクを担っている車の種類は、
そのチャネルは、トランスポートチャネルこれらの労働者が待っていることになった車のない仕事に車の取り扱い上の車に、このような車のこの一節に、車のパス

 

メインパッケージ

のインポート(
    " ログ" 
    " 同期" 
    " 時間" 

タイプstruct {プール
    workerNum int型
    ロードチャンカー
    WG         同期.WaitGroup 
} 

// オブジェクトの初期化 
FUNCのnewpool(のWnはint型)* プール{ 
    リターン&プール{workerNum:のWN、道:メイク(チャン・カー)} 
} 

// 特定のタスクを追加するためには、チャンネル 
FUNC(P *プール)AddCar(F * カー){ 
    p.road < - F 
} 

//をゴルーチン去工作 
FUNC(P *プール)ワーク(workId INT ){
     ため、F:= レンジp.road { 
        log.Println(" workId:"、workIdは、" 開始" 
        、F。やる()
        log.Println(" :workId "、workId、" 行って" 
    } 
    p.wg.Done()
} 

// 创建ゴルーチン等着接工作 
FUNC(P * プール)ラン(){
     のための I:= 0 ; I <p.workerNum。I ++ { 
        行くp.work(I)
        p.wg.Add(1 
    } 
    p.wg.Wait()
} 

FUNC(P * プール)colse(){ 
    近い(p.road)
} 

FUNCメイン(){ 
    プール: = NewPool(5 
    FUNC行きます() { 
        // 模拟要做10件事
         I:= 0 ; I < 10 ; I ++ { 
            車: = カー{ 
                PARAM:I、
            } 
            pool.AddCar( 車)
        } 
        pool.colse()
    }()
    pool.Run()
} 

/ *詳細DOこれを通過するもの* /
型車構造体{ 
    PARAM INT 
} 

FUNC(C * CAR)を行う()エラー{ 
    log.Println(時間.Now()、c.param)
    リターンゼロ
}

 

おすすめ

転載: www.cnblogs.com/taoshihan/p/11918442.html