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 INT)BOOL { // 私は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: =メイク(チャンBOOL、4は) // 現在の時刻を記録 スタート:= 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 INT)BOOL { 用 I:= 2 ; I <= N。I ++ { 場合のn%I == 0 { リターン 偽 } } 返す 真 } FUNCテスト(){ 開始: = time.Now() のために I = 1。I < 80000 ; I ++ { ISPRIME(I) } コスト: = time.Since(スタート) fmt.Printf(「従来の方法は時間がかかります。%S 」、コスト) }
最後に、それを実行し、結果を参照してください。
使用される方法は、実際に、従来の方法を使用するよりコルーチンではるかに高速であり、データのその量の更なる増加があります。したがって、パイプおよび実施例はさえ完了コルーチン、