Go は、競合するアプリケーションを簡単かつ効率的に構築できる機能で際立っています。これを可能にする機能の 1 つは、言語の最も強力な機能の 1 つであるゴルーチンです。他の言語を使用したことがある場合は、おそらくスレッドに精通していると思いますが、ゴルーチンは異なります。
ゴルーチンとは何ですか?
簡単に言うと、これらは他の関数またはメソッドと同時に実行される関数またはメソッドです。これらは OS スレッドよりも軽いため、はるかに少ないオーバーヘッドで何千もの Goroutine を作成できます。
スレッドとは何ですか?なぜゴルーチンを軽量化できるのですか?
スレッドは基本的にプロセス内の実行単位です。プロセスには複数のスレッドを含めることができ、すべて同じメモリ空間を共有しますが、独自の実行スタックを共有します。基本的に、プログラム内のアクティブな関数に関する情報を格納するデータ構造です。 OS スレッドは OS によって管理およびスケーリングされます。また、プロセスごとに数千スレッドという実質的な制限と固定スタック サイズ (通常、スレッドごとに 1 MB 以上) があります。
Goroutine は「グリーン スレッド」またはユーザーレベルのスレッドで、Go ランタイムによって管理され、動的スタック サイズはわずか 2KB から始まり、必要に応じて拡大または縮小できます。これが、ゴルーチンを軽量化できる理由です。
競争とは何ですか?また並列処理との違いは何ですか?
並行性は複数のタスクを同時に処理する行為ですが、並列性は複数のプロセッサ上でタスクを同時に実行します。少し混乱しますが、これでよく理解できるようになります。競争には、より多くの構造と組織が必要です。以下の例を参照してください:
並列処理には、実際には同時に実行される、より多くの実行が含まれます。以下の例を参照してください。
チャンネルとは何ですか?
チャネルは、ゴルーチン間の通信「チャネル」です。これらにより、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 サイトの他の関連記事を参照してください。