Heim häufiges Problem Kanalbezogene Erklärungen in Go-Sprache

Kanalbezogene Erklärungen in Go-Sprache

Apr 09, 2019 am 11:41 AM
channel go语言

Das CSP-Modell wird in der Go-Sprache für die Thread-Kommunikation verwendet. Genauer gesagt handelt es sich um die Kommunikation zwischen leichtgewichtigen Thread-Goroutinen. Das CSP-Modell ähnelt dem Actor-Modell. Es besteht ebenfalls aus unabhängigen Einheiten, die gleichzeitig ausführen. Die Einheiten kommunizieren auch durch das Senden von Nachrichten.

1. Der Unterschied zwischen Akteurmodell und CSP-Modell:

Aktoren kommunizieren direkt, während CSP über den Kopplungsgrad kommuniziert sind gleich. Es gibt einen Unterschied, letzteres ist lockerer gekoppelt.
Der Hauptunterschied besteht darin, dass im CSP-Modell der Absender und der Empfänger der Nachricht lose über den Kanal gekoppelt sind. Der Absender weiß nicht, welcher Empfänger die Nachricht konsumiert hat, und der Empfänger weiß nicht, welcher Absender die Nachricht gesendet hat. . Da der Akteur im Akteurmodell anhand seines eigenen Zustands auswählen kann, welche eingehende Nachricht er verarbeiten möchte, sind Autonomie und Kontrollierbarkeit besser.
Um den Prozess in der Go-Sprache nicht zu blockieren, müssen Programmierer verschiedene eingehende Nachrichten überprüfen, um die richtige Reihenfolge vorherzusehen und sicherzustellen. Der Vorteil von CSP besteht darin, dass Channel keine Nachrichten puffern muss, während Actor theoretisch ein Postfach unbegrenzter Größe als Nachrichtenpuffer benötigt.
Der Nachrichtensender des CSP-Modells kann nur dann eine Nachricht senden, wenn der Empfänger zum Empfang der Nachricht bereit ist. Im Gegensatz dazu ist die Nachrichtenübermittlung im Actor-Modell asynchron, d. h. das Senden und Empfangen von Nachrichten muss nicht gleichzeitig erfolgen und der Sender kann die Nachricht senden, bevor der Empfänger zum Empfang der Nachricht bereit ist.

2. Detaillierte Erläuterung des Go-Kanals
Das Definitionsformat des Kanaltyps ist wie folgt:

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
Nach dem Login kopieren

Es enthält die Definition von drei Typen. Das optionale <- gibt die Richtung des Kanals an. Wenn keine Richtung angegeben ist, ist der Kanal bidirektional und kann sowohl Daten empfangen als auch Daten senden.

chan T          // 可以接收和发送类型为 T 的数据
chan<- float64  // 只可以用来发送 float64 类型的数据
<-chan int      // 只可以用来接收 int 类型的数据
Nach dem Login kopieren

< - Immer zuerst mit dem Typ ganz links kombinieren. (Der <--Operator ordnet sich dem am weitesten links stehenden Kanal zu)

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

Standardmäßig blockieren Sender und Empfänger des Kanals, bis die andere Partei zum Senden oder Empfangen bereit ist, wodurch die Go-Sprache ohne Sperren oder Sonstiges funktioniert Bedingungen unterstützen natürlich die Parallelität.
Verwenden Sie make, um den Kanal zu initialisieren, und Sie können die Kapazität festlegen:

make(chan int, 100) #//创建一个有缓冲的int型Channel
Nach dem Login kopieren

Kapazität (Kapazität) stellt die maximale Anzahl von Elementen dar, die der Kanal aufnehmen kann, und stellt die Größe des Caches des Kanals dar.
Wenn die Kapazität nicht festgelegt ist oder die Kapazität auf 0 eingestellt ist, bedeutet dies, dass der Kanal keinen Cache hat.
Sie können in mehreren Goroutinen Daten von/an einen Kanal empfangen/senden, ohne zusätzliche Synchronisierungsmaßnahmen in Betracht ziehen zu müssen.
Der Kanal kann als First-In-First-Out-Warteschlange (FIFO) verwendet werden und die Reihenfolge der empfangenen und gesendeten Daten ist konsistent.
Ein Kanal ohne Pufferung verfügt sowohl über Kommunikations- als auch über Synchronisationseigenschaften und ist in der gleichzeitigen Entwicklung sehr beliebt.

// _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)
}
Nach dem Login kopieren

Hier erstellen wir einen ungepufferten String-Typ-Channel und übergeben dann „ping“ mit „channel<-“ in einer Goroutine an diesen Channel. <-Der Kanal empfängt diesen Wert und gibt ihn in der Hauptfunktion aus. Tatsächlich verwenden wir hier Channel, um die „Ping“-Nachricht stillschweigend von einer Goroutine an die Haupt-Goroutine zu übertragen und so die Kommunikation zwischen Threads (genauer gesagt zwischen Goroutinen) zu realisieren.
Da der Kanalsender und -empfänger blockiert, bis die andere Partei zum Senden oder Empfangen bereit ist, können wir auf die „Ping“-Nachricht am Ende des Programms warten, ohne dass weitere Synchronisierungsvorgänge erforderlich sind.
Sehen wir uns ein anderes Beispiel an: Nachdem die benutzerdefinierte Goroutine einen Vorgang abgeschlossen hat, erinnert sie die Haupt-Goroutine daran:

// 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
}
Nach dem Login kopieren

                                      

Das CSP-Modell wird in der Go-Sprache für die Thread-Kommunikation verwendet Genau genommen handelt es sich um die Kommunikation zwischen leichtgewichtigen Thread-Goroutinen. Das CSP-Modell ähnelt dem Actor-Modell. Es besteht ebenfalls aus unabhängigen Einheiten, die gleichzeitig ausgeführt werden. Die Einheiten kommunizieren auch durch das Senden von Nachrichten. [Empfohlener Kurs: Go-Video-Tutorial]

Das obige ist der detaillierte Inhalt vonKanalbezogene Erklärungen in Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Apr 02, 2025 pm 02:03 PM

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Apr 02, 2025 pm 05:09 PM

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Apr 02, 2025 pm 04:54 PM

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Apr 02, 2025 pm 04:12 PM

Welche Bibliotheken in GO werden von großen Unternehmen oder bekannten Open-Source-Projekten entwickelt? Bei der Programmierung in Go begegnen Entwickler häufig auf einige häufige Bedürfnisse, ...

Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Apr 02, 2025 pm 12:57 PM

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Warum gibt es bei Verwendung von SQL.Open keinen Fehler an, wenn DSN leer ist? Warum gibt es bei Verwendung von SQL.Open keinen Fehler an, wenn DSN leer ist? Apr 02, 2025 pm 12:54 PM

Warum meldet der DSN bei Verwendung von SQL.Open keinen Fehler? In Go Language, Sql.open ...