Goで並行性を実装する方法



Goで並行性を実装する方法
移動は、複数のコアで近代的なコンピュータ上で実行するように設計されました.GO Goroutinesとチャネルを介して同時実行のための最初の手をサポートしています.Goで並行プログラムを書くのは、単一のキーワードを追加するのと同じくらい簡単です.実装にまっすぐ進みましょう.

並行性とは何か
私は簡単な例を与えましょう:私は本を読んでいると私は私の友人からテキストを得た.今、私は私が私の本を読んで戻ってそれを行って一度テキストを表示するために私の電話をチェックするために読書を停止します.私が本当にしていることは、多くのタスク(この場合2つ)を扱うことです.人々は類似しているように見えるので、並列性と並行性をしばしば混同します.並列性は、同時にタスクを実行している(あなたの好きな音楽を聴いている間に書く).並列性は並行性の一部であると言うことができますが、その逆も真ではありません.
並行性は独立して多くのタスクを実行することです.それらは、同時に実行されるかもしれないし、あるいは実行されるかもしれない

Want to know more about concurrency go check out talk by Rob Pike



単純な例
ここでは、タスクを印刷する簡単な仕事を行うGOの単純なプログラムの例です.
package main

import (
    "fmt"
)

func performTask(task int) {
    fmt.Println("Performing", task)
}

func main() {
    performTask(1)
    performTask(2)
    performTask(3)
}
出力
Performing 1
Performing 2
Performing 3
上記のプログラムは任意の問題なしで完璧に動作します.さあ、並行しましょう.囲碁で何かを同時に実行するために、ビルトインのキーワードを使いますgo somethingYouWantToRun() . 基本的にはgo キーワードはGoroutineとして機能を実行します.

グールーティンとは
GoroutineはGoランタイムによって管理される軽量スレッドです.基本的にGoroutineは、M GoroutinesがN OSスレッド上で動くスレッドの上の抽象化です.実際には、パフォーマンスのわずかな違いに気づかずにわずか3 - 4 OSのスレッドでゴローンの1000のを実行している可能性があります.

Goroutineの例
我々は今、追加されますgo キーワード前performTask(2) それをバックグラウンドで実行させる.
package main

import (
    "fmt"
)

func performTask(task int) {
    fmt.Println("Performing", task)
}

func main() {
    performTask(1)
    go performTask(2)
    performTask(3)
}
出力
Performing 1
Performing 3
あなたが上記のプログラムの出力を見ることができて、それがPerforming 2 テキスト.ここで正確に起こっていることを説明しましょうgo キーワードはバックグラウンドで実行されているので、出力を出力できる時間によってメインスレッドが戻り、Performing 2 .
では、どうやってこれを修正できますか?お見せしましょう.
package main

import (
    "fmt"
    "sync"
)

func performTask(task int, wg *sync.WaitGroup) {
    fmt.Println("Performing", task)
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i <= 2; i++ {
        wg.Add(1)
        go performTask(i, &wg)
    }
    wg.Wait()
}
出力
Performing 2
Performing 0
Performing 1
今、あなたは我々がすべての3つのタスクを印刷しているを見ることができます.私たちが何をしたか説明しましょう.上記の同時実行を実現するためにwaitグループを使用しています.
  • var wg sync.WaitGroup : Waitgroupは、ゴールにGoroutinesのコレクションを待ちます.
  • wg.Add(1) : add waitグループを1つずつ増やします.
  • wg.Done() : 完了したWaitGroupのカウンタを1つずつ.
  • wg.Wait() : waitグループがゼロになるまで待ちます.
  • それで、我々が上でしていることは我々がGoroutineをつくるたびに、我々がGoroutineをつくるたびに、1つによってカウンタを増分することですwg.Wait() . Goroutineが実行されるたびに、その仕事は実行されますwg.Done() これは基本的にゴロゴネスの数のカウンタを減らすために待機します.

    結論
    あなたは様々な方法で囲碁で並行性を実装できます.私は、あなたに方法の1つを示しました.あなたは、チャンネルと他のコンカレンシーパターンを囲碁に見ることができます.

    If you liked this blog give me a shout-out in the comment and do share it on twitter. Also do let me know what would like me to write next.