ホームページ よくある問題 Go言語によるチャンネル関連の説明

Go言語によるチャンネル関連の説明

Apr 09, 2019 am 11:41 AM
channel 言語を移動

CSP モデルは、Go 言語のスレッド通信に使用されます (正確には、軽量スレッドのゴルーチン間の通信です)。 CSP モデルはアクター モデルに似ており、同時に実行される独立したエンティティで構成されており、エンティティはメッセージを送信して通信します。

1. アクター モデルと CSP モデルの違い:

アクターは直接通信しますが、CSP はチャネルを通じて通信します。結合度の点では、この 2 つは同じですが、後者はより疎結合であるという違いがあります。
主な違いは、CSP モデルでは、メッセージの送信者と受信者がチャネルを通じて疎結合されていることです。送信者はどの受信者がメッセージを消費したかを知らず、受信者はどの送信者がメッセージを送信したかを知りません。 。アクター モデルでは、アクターは自身の状態に基づいてどの受信メッセージを処理するかを選択できるため、自律性と制御性が向上します。
Go 言語のプロセスをブロックしないようにするには、プログラマはさまざまな受信メッセージをチェックして、正しい順序を予測して確認する必要があります。 CSP の利点は、Channel がメッセージをバッファリングする必要がないのに対し、Actor は理論的にはメッセージ バッファとしてサイズ無制限のメールボックスを必要とすることです。
CSP モデルのメッセージ送信者は、受信者がメッセージを受信する準備ができている場合にのみメッセージを送信できます。対照的に、Actor モデルでのメッセージ パッシングは非同期です。つまり、メッセージの送信と受信を同時に行う必要はなく、受信者がメッセージを受信する準備ができる前に、送信者はメッセージを送信できます。

2. Go Channel の詳細説明
Channel タイプの定義形式は以下のとおりです:

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
ログイン後にコピー

3 つのタイプの定義が含まれます。オプションの <- はチャネルの方向を表します。方向が指定されていない場合、チャネルは双方向であり、データの受信と送信の両方が可能です。

chan T          // 可以接收和发送类型为 T 的数据
chan<- float64  // 只可以用来发送 float64 类型的数据
<-chan int      // 只可以用来接收 int 类型的数据
ログイン後にコピー

<-常に最初に一番左のタイプと組み合わせます。 (<- 演算子は可能な限り左端の chan に関連付けられます)

c := make(chan bool) //创建一个无缓冲的bool型Channel
c <- x        //向一个Channel发送一个值
<- c          //从一个Channel中接收一个值
x = <- c      //从Channel c接收一个值并将其存储到x中
x, ok = <- c  //从Channel接收一个值,如果channel关闭了或没有数据,那么ok将被置为false
ログイン後にコピー

デフォルトでは、チャネルの送信者と受信者は、相手が送受信の準備ができるまでブロックされます。これにより、Go 言語はロックやその他の必要がなくなります。条件は自然に同時実行をサポートします。
make を使用してチャネルを初期化すると、容量を設定できます。

make(chan int, 100) #//创建一个有缓冲的int型Channel
ログイン後にコピー

Capacity (容量) は、チャネルが収容できる要素の最大数を表し、チャネルのキャッシュのサイズを表します。
容量が設定されていない場合、または容量が 0 に設定されている場合は、チャネルにキャッシュがないことを意味します。
追加の同期措置を考慮することなく、複数のゴルーチン内のチャネルとの間でデータを送受信できます。
チャネルは先入れ先出し (FIFO) キューとして使用でき、受信データと送信データの順序は一致します。
バッファリングのないチャネルは通信と同期の両方の特性を備えており、同時開発で非常に人気があります。

// _Channels_ are the pipes that connect concurrent
// goroutines. You can send values into channels from one
// goroutine and receive those values into another
// goroutine.

package main

import "fmt"

func main() {

    // Create a new channel with `make(chan val-type)`.
    // Channels are typed by the values they convey.
    messages := make(chan string)

    // _Send_ a value into a channel using the `channel <-`
    // syntax. Here we send `"ping"`  to the `messages`
    // channel we made above, from a new goroutine.
    go func() { messages <- "ping" }()

    // The `<-channel` syntax _receives_ a value from the
    // channel. Here we&#39;ll receive the `"ping"` message
    // we sent above and print it out.
    msg := <-messages
    fmt.Println(msg)
}
ログイン後にコピー

ここでは、バッファリングされていない文字列型のチャネルを作成し、ゴルーチンで channel<- を使用してこのチャネルに「ping」を渡します。 <- チャネルはこの値を受け取り、main 関数で出力します。実際、ここでは Channel を使ってゴルーチンからメインのゴルーチンに「ping」メッセージを静かに転送し、スレッド間(正確にはゴルーチン間)の通信を実現しています。
チャネルの送信側と受信側は、相手側が送信または受信の準備ができるまでブロックされるため、他の同期操作を必要とせずに、プログラムの最後に「ping」メッセージを待つことができます。
別の例を見てみましょう: ユーザー定義のゴルーチンが操作を完了すると、メインのゴルーチンに通知します:

// We can use channels to synchronize execution// across goroutines. Here&#39;s an example of using a// blocking receive to wait for a goroutine to finish.package mainimport "fmt"import "time"// This is the function we&#39;ll run in a goroutine. The// `done` channel will be used to notify another// goroutine that this function&#39;s work is done.func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")    // Send a value to notify that we&#39;re done.
    done <- true}func main() {    // Start a worker goroutine, giving it the channel to
    // notify on.
    done := make(chan bool, 1)    go worker(done)    // Block until we receive a notification from the
    // worker on the channel.
    <-done
}
ログイン後にコピー

CSP モデルは、Go 言語でのスレッド通信に使用されます (正確には、軽量スレッドのゴルーチン間の通信です)。 CSP モデルはアクター モデルに似ており、同時に実行される独立したエンティティで構成されており、エンティティはメッセージを送信して通信します。

【おすすめコース: Go ビデオチュートリアル

以上が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を使用する問題を調査します。 �...

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

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

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

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

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

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つの異なる執筆方法を見ます:最初...

SQL.Openを使用するとき、DSNが空に渡されたときにエラーを報告しないのはなぜですか? SQL.Openを使用するとき、DSNが空に渡されたときにエラーを報告しないのはなぜですか? Apr 02, 2025 pm 12:54 PM

SQL.Openを使用する場合、DSNがエラーを報告しないのはなぜですか? GO言語では、sql.open ...