ホームページ > バックエンド開発 > Golang > ゴルーチンを理解する

ゴルーチンを理解する

Barbara Streisand
リリース: 2024-11-28 05:39:14
オリジナル
320 人が閲覧しました

Go は、競合するアプリケーションを簡単かつ効率的に構築できる機能で際立っています。これを可能にする機能の 1 つは、言語の最も強力な機能の 1 つであるゴルーチンです。他の言語を使用したことがある場合は、おそらくスレッドに精通していると思いますが、ゴルーチンは異なります。

ゴルーチンとは何ですか?

Entendendo Goroutines

簡単に言うと、これらは他の関数またはメソッドと同時に実行される関数またはメソッドです。これらは OS スレッドよりも軽いため、はるかに少ないオーバーヘッドで何千もの Goroutine を作成できます。

スレッドとは何ですか?なぜゴルーチンを軽量化できるのですか?

スレッドは基本的にプロセス内の実行単位です。プロセスには複数のスレッドを含めることができ、すべて同じメモリ空間を共有しますが、独自の実行スタックを共有します。基本的に、プログラム内のアクティブな関数に関する情報を格納するデータ構造です。 OS スレッドは OS によって管理およびスケーリングされます。また、プロセスごとに数千スレッドという実質的な制限と固定スタック サイズ (通常、スレッドごとに 1 MB 以上) があります。

Goroutine は「グリーン スレッド」またはユーザーレベルのスレッドで、Go ランタイムによって管理され、動的スタック サイズはわずか 2KB から始まり、必要に応じて拡大または縮小できます。これが、ゴルーチンを軽量化できる理由です。

競争とは何ですか?また並列処理との違いは何ですか?

Entendendo Goroutines

並行性は複数のタスクを同時に処理する行為ですが、並列性は複数のプロセッサ上でタスクを同時に実行します。少し混乱しますが、これでよく理解できるようになります。競争には、より多くの構造と組織が必要です。以下の例を参照してください:

並列処理には、実際には同時に実行される、より多くの実行が含まれます。以下の例を参照してください。

チャンネルとは何ですか?

Entendendo Goroutines

チャネルは、ゴルーチン間の通信「チャネル」です。これらにより、Goroutine が通信し、実行を同期できるようになります。チャネルを使用したゴルーチン間の通信の例:

func main() {
    ch := make(chan string)

    go func() {
        ch <- "Mensagem da goroutine"
    }()

    msg := <-ch
    fmt.Println(msg)
}
ログイン後にコピー

それでは、Goroutine の使用例で終わりましょう:

// 1. Fazendo café e torrada ao mesmo tempo
func cafeDaManha() {
   fmt.Println("Iniciando café da manhã...") // 1º: Aparece primeiro

   go fazerCafe()    // 2º: "Começando a fazer café..."
   go fazerTorrada() // 3º: "Começando a fazer torrada..."

   // Espera 5 segundos para tudo ficar pronto
   time.Sleep(5 * time.Second)
   fmt.Println("Café da manhã pronto!") // Último: Aparece depois de 5 segundos
}

func fazerCafe() {
   fmt.Println("Começando a fazer café...")
   time.Sleep(3 * time.Second) 
   fmt.Println("Café pronto!") // 4º: Aparece após 3 segundos
}

func fazerTorrada() {
   fmt.Println("Começando a fazer torrada...")
   time.Sleep(2 * time.Second)
   fmt.Println("Torrada pronta!") // 5º: Aparece após 2 segundos
}

/* Saída:
Iniciando café da manhã...
Começando a fazer café...
Começando a fazer torrada...
Torrada pronta! (após 2 segundos)
Café pronto! (após 3 segundos)
Café da manhã pronto! (após 5 segundos)
*/

// 2. Contagem com Goroutines
func contagem() {
   go contar("A", 5) // Começa a contar imediatamente
   go contar("B", 5) // Começa a contar imediatamente

   time.Sleep(6 * time.Second)
}

func contar(nome string, até int) {
   for i := 1; i <= até; i++ {
       fmt.Printf("%s: %d\n", nome, i)
       time.Sleep(1 * time.Second)
   }
}

/* Saída (aproximada - as linhas A e B se misturam):
A: 1
B: 1
A: 2
B: 2
A: 3
B: 3
A: 4
B: 4
A: 5
B: 5
*/

// 3. Enviando mensagens simples
func mensagens() {
   canal := make(chan string)

   go func() {
       canal <- "Olá!"      // 1ª mensagem enviada
       canal <- "Tudo bem?" // 2ª mensagem enviada
       canal <- "Tchau!"    // 3ª mensagem enviada
   }()

   fmt.Println(<-canal) // 1º: Imprime "Olá!"
   fmt.Println(<-canal) // 2º: Imprime "Tudo bem?"
   fmt.Println(<-canal) // 3º: Imprime "Tchau!"
}

/* Saída:
Olá!
Tudo bem?
Tchau!
*/
ログイン後にコピー

以上がゴルーチンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート