ゴルーチンは、抽象化の軽量スレッドに基づいています。それは、私たちは、非常に低コストの方法または並列に同じアドレス空間内で複数の機能で実行することができます。スレッド、小さいくらいのその創造と破壊のコストと比較すると、それはスケジューリングスレッドとは無関係です。ゴルーチンはgolang中に「行く」キーワードを使用して、非常にシンプルを作成します。
違いゴルーチンとスレッド
多くの人々は、そのゴルーチンが速くスレッドより実行すると考えています
これは誤解です。ゴルーチン速くありません、
それはちょうどより多くの並行処理を追加します。
ゴルーチンは、(そのようなIOを待っているように)遮断された場合、スケジューラgolang、他のゴルーチン動作を行うことができるスケジュールします。
糸と比較すると、それは次のような利点があります。
少ないメモリ消費量:
ゴルーチン必要なメモリのみ通常2キロバイト、およびスレッドが1Mbのに(500回)が必要になります。
創造と破壊のオーバーヘッド小さいです
パッケージメイン インポート( "FMT" "時間" ) 付けたnewtask関数(){ にとって { fmt.Println( "これは付けたnewtaskです") time.Sleep(time.Second)//遅延1S } } FUNCのmain(){ 新しいタスクを作成し、新しいコルーチンを作成するために、キーワード行く付けたnewtask()//行きます /*にとって{ fmt.Println(「これはメインのゴルーチンです」) time.Sleep(time.Second) } * / I:= 0 にとって{ I ++ fmt.Println(「これはメインのゴルーチンです」) time.Sleep(time.Second) 私は==場合2 { ブレーク } } }
パッケージメイン インポート( "FMT" "時間" ) //メインプログラムの引き出されたサブルーチンを終了し、サブプログラムは終了するのに時間がかかります FUNCのmain(){ {)(FUNC行きます I:= 0 にとって { I ++ fmt.Println( "私は=サブコルーチン"、I) time.Sleep(time.Second) } }() I:= 0 にとって{ I ++ fmt.Println( "=メインI"、I) time.Sleep(time.Second) 私は==場合2 { ブレーク } } }