(44人)golang--コルーチン(ゴルーチン)とパイプ(チャネル)の組合せの例

1から8000のまでの統計間の素数。

全体的なフレームワーク:

 

説明:5つのコルーチン、3本のパイプがあります。前記背後コルーチン最後の4の場合、プライムprimeChanパイプラインを書き込み、その後、書き込み用コルーチンintChanコンジットデジタル素数かどうかを引き出すと判断し、追加のための4つのデジタルintChan管、および4コルーチンの使用は、タスク、および終了を完了したかどうかを判断するためのパイプライン、最後のサイクルを終了し、真のライトでの作業の後。

main.go

パッケージメイン

インポート(
    " FMT " 
    " go_code / project_13 /テスト" 
    " 時間"

FUNC putNum(intChanちゃんINT ){
      I:= 1 ; I <= 80000 ; I ++ {
        intChan < - I
    }
    クローズ(intChan)
}

isPrime FUNC(N INTBOOL {
     // 私はintに必要であろう。ここで(math.Sqrt(のfloat64(N) ))、計算時間のためには、直接配置されている
    ため、I = 2 ; iが<= N; iが++ {
         IF N-Iの%== 0 {
             リターン 偽に
        }
    }
    返す 
}

FUNC primeNum(intChanちゃんのint型、primeChanちゃんint型、exitChanちゃんブール値){
     のための{
         // time.Sleep(time.Millisecond * 10) 
        NUM、[OK]:= < - intChan
         あれば[OK] {
             ブレーク
        }
        ISP: = isPrime(NUM)
         であればISP {
             続ける
        } {
            primeChan < - NUM
        }
    }
    fmt.Println(コルーチンは、データの出ていません
    exitChan < - 
}

FUNCのmain(){
    intChan: =メイク(ちゃんint型1000年
    primeChan: =メイク(ちゃんint型20000 
    exitChan: =メイク(チャンBOOL4は// 現在の時刻を記録 
    スタート:= Time.now()
     // コルーチンターンオン
    ゴーputNum(intChan)
     // 4つのコルーチンを回す
    ために I:= 0 ; I < 。4 ; I ++ {
        行くprimeNum(intChan、primeChan、exitChan)
    }
    // ときにすべての4つのコルーチンタスク、経過時間を計算し、近い導管primeChan 
    ゴーFUNC(){
          I:= 0 ; I < 4。 ; I ++ {
             < - exitChan
        }
        コスト: = time.Since(スタート)
        fmt.Printf(" 使用コルーチン時間のかかる:%S \ N- " 、コスト)
        クローズ(primeChan)
    }()

    以下のための{
         // = <-primeChan:RES、[OK] 
        - = <:_、OK primeChan
         あれば[OK] {
             ブレーク
        }
        // ここでの計算は、コメント操作印刷時間を計算するために、完了
         // fmt.Printf( "Dプライム%= \ N-"、RES)を
    }
    fmt.Println(メインスレッドが終了
    test.Test()
}

test.go

パッケージテスト

インポート(
    FMT 
    時間

FUNC isPrime(N INTBOOL {
      I:= 2 ; I <= N。I ++ {
         場合のn%I == 0 {
             リターン 
        }
    }
    返す 
}
FUNCテスト(){
    開始: = time.Now()
     のために I = 1I < 80000 ; I ++ {
        ISPRIME(I)
    }
    コスト: = time.Since(スタート)
    fmt.Printf(従来の方法は時間がかかります。%S 、コスト)
}

最後に、それを実行し、結果を参照してください。

使用される方法は、実際に、従来の方法を使用するよりコルーチンではるかに高速であり、データのその量の更なる増加があります。したがって、パイプおよび実施例はさえ完了コルーチン、 

おすすめ

転載: www.cnblogs.com/xiximayou/p/11959090.html