ホームページ バックエンド開発 Golang ネットワーク プログラミング クイック スタート: Go 言語での同時プログラミング

ネットワーク プログラミング クイック スタート: Go 言語での同時プログラミング

Jun 18, 2023 am 10:01 AM
言語を移動 同時プログラミング ネットワークプログラミング

ネットワーク プログラミング クイック スタート: Go 言語での同時プログラミング

インターネットの発展に伴い、ネットワーク プログラミングはプログラマーが習得しなければならないスキルの 1 つになりました。同時プログラミングは、特に同時実行性が高い状況では、ネットワーク プログラミングに不可欠な部分です。 Go 言語は効率的な同時プログラミングを特徴とするプログラミング言語であり、その同時実行モデルは他の言語に比べて単純かつ明確です。この記事では、初心者がすぐに始められるように、Go 言語での同時プログラミングを紹介します。

  1. Goroutine

Goroutine は Go 言語の軽量スレッドであり、Go 言語の同時実行性は Goroutine を通じて実現されます。各ゴルーチンは異なるコードを同時に実行でき、ゴルーチンのオーバーヘッドは非常に小さいため、メモリ消費を気にせずに数万のゴルーチンを簡単に開くことができます。 Goroutine の基本的な使い方は非常に簡単で、関数呼び出しの前に go キーワードを追加するだけで Goroutine を起動します。

たとえば、次のコードを通じて Goroutine を作成できます:

func main() {
    go printHello()
}

func printHello() {
    fmt.Println("Hello, world!")
}
ログイン後にコピー

上記のコードでは、Go プログラムが go printHello() を実行すると、実行する新しい Goroutine が開始されます。 printHello 関数。 printHello 関数は main 関数とは独立して実行されるため、プログラムはすぐに「Hello, world!」を出力します。

  1. チャネル

ゴルーチン間の通信はチャネルを通じて行われます。チャネルはゴルーチン間のパイプラインとして見ることができ、データの送受信に使用できます。 Go 言語のチャネルはデータを同期的に送信でき、非同期プログラミングの実装にも使用できます。 Channel の作成と使用方法も非常に簡単で、make 関数を使用して作成し、<- 演算子を使用してデータを送受信するだけです。

たとえば、次のコードを通じてチャネルを作成し、データを送信できます:

func main() {
    ch := make(chan int)
    go send(ch)
    fmt.Println(<-ch)
}

func send(ch chan int) {
    ch <- 1
}
ログイン後にコピー

上記のコードでは、整数のチャネルを作成し、データ送信用のゴルーチンを開始します。 main 関数はチャネルが <-ch ステートメントを通じてデータを送信するのをブロックして待ち、データを受信した後、プログラムは "1" を出力します。

チャネルを使用すると、複数のゴルーチン間でデータを送信でき、共有メモリを使用するときに考慮する必要がある同期の問題を回避できます。さらに、チャネルを通じて複数のゴルーチン間の調整と同期を実現できるため、複雑な同時プログラミング タスクを実現できます。

  1. Select

複数のゴルーチンの複数のチャネルからデータを読み取る場合、Go 言語の選択構文を使用して処理できます。 select 構文は Switch 構文に似ています。複数のチャネルのデータ相互作用を監視できます。チャネルの 1 つにデータが表示されると、対応するコード ブロックがトリガーされます。

たとえば、次のコードを通じて 2 つのゴルーチンを作成し、選択構文を使用して Chanenl の読み取りを処理できます。

func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)
    go func() {
        ch1 <- 1
    }()
    go func() {
        ch2 <- 2
    }()
    select {
        case x := <- ch1:
            fmt.Println("Received from ch1:", x)
        case x := <- ch2:
            fmt.Println("Received from ch2:", x)
    }
}
ログイン後にコピー

上記のコードでは、メッセージを送信する 2 つのゴルーチンを作成しました。 2 つのチャネルがそれぞれデータを送信します。 select ステートメントを使用して 2 つのチャネルのデータ送信を監視し、一方のチャネルがデータを送信している限り、対応するコード ブロックが実行され、受信データが出力されます。

  1. Mutex

Go 言語は、同じ変数に同時にアクセスするための複数のスレッドをサポートしています。変数を同時に書き込むときのデータの不整合の問題を解決するために、Go は言語はロックへの Mutex ミューテックス ロックを提供します。変数を変更するときは、最初に Mutex.Lock() メソッドを通じてロックを開きます。この時点では 1 つのスレッドのみがロックを取得しており、この時点でロックを取得しようとすると他のスレッドはブロックされます。変数の使用が終了したら、手動で Mutex.Unlock() メソッドを使用してロックを解除し、ロック リソースを解放する必要があります。

たとえば、次のコードを通じて Mutex の使用をデモンストレーションできます:

import (
    "fmt"
    "sync"
    "time"
)

var wg sync.WaitGroup
var mutex sync.Mutex
var counter int

func main() {
  for i := 0; i < 10; i++ {
    wg.Add(1)
    go increment()
  }
  wg.Wait()
  fmt.Println("Final counter:", counter)
}

func increment() {
  mutex.Lock()
  defer mutex.Unlock()
  counter++
  time.Sleep(time.Second)
  fmt.Println("Counter value:", counter)
  wg.Done()
}
ログイン後にコピー

上記のコードでは、10 個のゴルーチンを作成し、各ゴルーチンがカウンター変数に 1 つ追加します。データの正確性を確保するために、Mutex を使用してカウンターを保護します。 Goroutine で Mutex.Lock() メソッドを呼び出してロックを取得し、操作後に Mutex.Unlock() メソッドを呼び出してロックを解除します。 WaitGroup を使用してすべての Goroutine の実行が完了するのを待った後、最終的なカウンター値を出力します。

概要

Go 言語での同時プログラミングは、データ送信に Goroutine と Channel を使用し、Mutex を使用して変数の同期と保護を行い、select を使用して複数の Channel を読み取ります。これらのメカニズムを合理的に使用することで、同時実行性の高いアプリケーション シナリオで強力な役割を果たす、効率的で明確で保守が容易な同時実行プログラムを作成できます。

以上がネットワーク プログラミング クイック スタート: Go 言語での同時プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

携帯電話でXMLをPDFに変換する方法は? 携帯電話でXMLをPDFに変換する方法は? Apr 02, 2025 pm 10:18 PM

携帯電話でXMLをPDFに直接変換するのは簡単ではありませんが、クラウドサービスの助けを借りて実現できます。軽量モバイルアプリを使用してXMLファイルをアップロードし、生成されたPDFを受信し、クラウドAPIで変換することをお勧めします。クラウドAPIはサーバーレスコンピューティングサービスを使用し、適切なプラットフォームを選択することが重要です。 XMLの解析とPDF生成を処理する際には、複雑さ、エラー処理、セキュリティ、および最適化戦略を考慮する必要があります。プロセス全体では、フロントエンドアプリとバックエンドAPIが連携する必要があり、さまざまなテクノロジーをある程度理解する必要があります。

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

See all articles