Heim Backend-Entwicklung Golang Der beste Weg, gleichzeitige und asynchrone Programmierung mit der Go-Sprache zu implementieren

Der beste Weg, gleichzeitige und asynchrone Programmierung mit der Go-Sprache zu implementieren

Jun 04, 2023 am 09:31 AM
go语言 并发编程 异步编程

Mit der Verbesserung der Leistung der Computerhardware müssen immer mehr Anwendungen eine große Anzahl gleichzeitiger und asynchroner Aufgaben bewältigen. Dies wirft die Frage auf: Wie können diese Aufgaben effizient erledigt und die Qualität des Codes sichergestellt werden? Die Go-Sprache verfügt über die inhärente Fähigkeit, gleichzeitige und asynchrone Programmierung zu unterstützen. In diesem Artikel wird die beste Möglichkeit vorgestellt, gleichzeitige und asynchrone Programmierung mithilfe der Go-Sprache zu implementieren.

1. Verstehen Sie die Parallelität und das asynchrone Programmiermodell der Go-Sprache.

Die Parallelität und das asynchrone Programmiermodell der Go-Sprache werden basierend auf Goroutine und Kanal implementiert. Goroutine ist ein leichter Thread, der mehrere Aufgaben gleichzeitig in einem Programm ausführen kann. Kanal ist ein Kommunikationskanal zwischen Goroutinen, der die Datenübertragung zwischen verschiedenen Goroutinen realisieren kann.

In der Go-Sprache kann eine neue Goroutine mit dem Schlüsselwort go gestartet werden. Wie unten gezeigt:

go func() {
  // do something
}()
Nach dem Login kopieren

Im obigen Code stellt func() den auszuführenden Funktionscode dar. Wenn Sie diese Funktion mit dem Schlüsselwort go starten, wird sie in einer neuen Goroutine ausgeführt.

In der Go-Sprache wird das CSP-Modell (Communicating Sequential Processes) übernommen, was bedeutet, dass Parallelität und Zusammenarbeit über Kanäle erfolgen. Ein Kanal hat zwei Endpunkte: Senden und Empfangen. Die Kommunikation zwischen Goroutinen kann durch Senden und Empfangen von Kanälen erreicht werden.

2. So erstellen und verwenden Sie einen Kanal

Erstellen Sie in der Go-Sprache einen Kanal über die Make-Funktion. So erstellen Sie einen Kanal vom Typ String:

ch := make(chan string)
Nach dem Login kopieren

Verwenden Sie das <-Symbol, um Daten an den Kanal zu senden:

ch <- "Hello world"
Nach dem Login kopieren

Verwenden Sie das <-Symbol, um Daten zu empfangen vom Kanal:

msg := <-ch
Nach dem Login kopieren

Hinweis: Wenn keine Daten zum Empfangen vorhanden sind, blockiert das Programm den Empfangsvorgang. Wenn der Kanal voll ist, wird der Sendevorgang ebenfalls blockiert.

Es gibt auch eine Schlüsselwortauswahl in der Go-Sprache, mit der die Ausführung von Goroutine ausgewählt werden kann. Select kann mehrere Fälle enthalten. Jeder Fall ist ein Empfangs- oder Sendevorgang eines Kanals. Wenn „select“ ausgeführt wird, wird zufällig ein verfügbarer Fall zur Ausführung ausgewählt. Wenn kein Fall verfügbar ist, wird er blockiert.

Hier ist ein Beispiel:

ch1 := make(chan int)
ch2 := make(chan int)

go func() {
  for i := 0; i < 10; i++ {
    ch1 <- i
  }
}()

go func() {
  for i := 0; i < 10; i++ {
    ch2 <- i
  }
}()

for i := 0; i < 20; i++ {
  select {
  case v := <-ch1:
    fmt.Println("ch1:", v)
  case v := <-ch2:
    fmt.Println("ch2:", v)
  }
}
Nach dem Login kopieren

Im obigen Beispiel haben wir zwei Goroutinen erstellt, eine zum Senden von Daten an Kanal 1 und die andere zum Senden von Daten an Kanal 2. Verwenden Sie dann die Select-Anweisung in der Haupt-Goroutine, um die Daten von CH1 und CH2 zu überwachen. Wenn Daten verfügbar sind, wird die entsprechende Case-Anweisung ausgeführt.

3. Verwenden Sie WaitGroup, um die Ausführung von Goroutine zu steuern

Normalerweise müssen wir warten, bis die gesamte Goroutine-Ausführung abgeschlossen ist, bevor wir andere Vorgänge ausführen. Sie können WaitGroup im Synchronisierungspaket verwenden, um diese Anforderung zu erfüllen. WaitGroup kann verwendet werden, um auf den Abschluss einer Gruppe von Goroutinen zu warten.

Das Folgende ist ein Beispiel:

var wg sync.WaitGroup

func main() {
  for i := 0; i < 10; i++ {
    wg.Add(1)
    go func() {
      defer wg.Done()
      // do something
    }()
  }

  wg.Wait()
  // All goroutines are done
}
Nach dem Login kopieren

Im obigen Beispiel haben wir 10 Goroutinen erstellt und der Aufruf der Add-Methode in WaitGroup zeigt an, dass 10 Goroutinen ausgeführt werden. Verwenden Sie dann defer stmt.Done() in jeder Goroutine, um WaitGroup mitzuteilen, dass die Goroutine abgeschlossen ist. Schließlich wird die Wait-Methode in der Haupt-Goroutine aufgerufen, um darauf zu warten, dass alle Goroutinen die Ausführung abschließen.

4. Verwenden Sie sync.Mutex, um die Datensicherheit zu gewährleisten.

Wenn in der Go-Sprache von mehreren Goroutinen gleichzeitig auf eine Variable zugegriffen wird, müssen Sie a verwenden Sperre, um die Datensicherheit zu gewährleisten. Sperren können mit Mutex aus dem Sync-Paket implementiert werden.

Hier ist ein Beispiel:

var mu sync.Mutex
var count int

func inc() {
  mu.Lock()
  defer mu.Unlock()
  count++
}

func main() {
  for i := 0; i < 10; i++ {
    go inc()
  }

  time.Sleep(time.Second)

  fmt.Println("count:", count)
}
Nach dem Login kopieren

Im obigen Beispiel haben wir ein .Mutex-Objekt erstellt, um sicherzustellen, dass der Zugriff auf count threadsicher ist. In der Funktion „inc“ erwerben wir zunächst die Sperre und geben sie dann in „defer“ frei. In der Hauptfunktion starten wir 10 Inc-Goroutinen, um auf count zuzugreifen.

5. Verwenden Sie das Kontextpaket, um Zeitüberschreitungen und Abbrüche zu verarbeiten.

In der Go-Sprache können wir das Kontextpaket verwenden, um Zeitüberschreitungen und Abbrüche zu behandeln, um Goroutine-Lecks und Ressourcenverschwendung zu vermeiden . Der Kontext kann Fristen festlegen und Signale abbrechen. Alle Goroutinen werden abgebrochen, wenn das Signal ausgelöst wird.

Das Folgende ist ein Beispiel:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
defer cancel()

ch := make(chan int)

go func() {
  time.Sleep(time.Second * 5)
  ch <- 1
}()

select {
case <-ch:
  fmt.Println("received")
case <-ctx.Done():
  fmt.Println("timeout or cancelled")
}
Nach dem Login kopieren

Im obigen Beispiel verwenden wir die context.WithTimeout-Funktion, um ein Context-Objekt mit einem Timeout von 3 Sekunden zu erstellen und ein zu starten Goroutine soll 5 Sekunden warten. Wenn in der Select-Anweisung die Goroutine innerhalb von 3 Sekunden abgeschlossen ist, geben Sie „received“ aus, andernfalls geben Sie „timeout or cancelled“ aus.

6. Zusammenfassung

Gleichzeitige und asynchrone Programmierung können mit der Go-Sprache einfach implementiert werden. Durch die Verwendung von Goroutinen und Kanälen können wir effiziente Parallelitätsmodelle erstellen. Gleichzeitig kann die Verwendung von WaitGroup, Mutex und Context unser Programm sicherer und robuster machen.

Natürlich können hohe Parallelität und asynchrone Programmierung bei unsachgemäßer Verwendung auch einige Probleme verursachen, z. B. Rennbedingungen, Deadlocks, Hunger und andere Probleme. Achten Sie daher bei der gleichzeitigen und asynchronen Programmierung unbedingt auf die Qualität und Korrektheit des Codes.

Das obige ist der detaillierte Inhalt vonDer beste Weg, gleichzeitige und asynchrone Programmierung mit der Go-Sprache zu implementieren. 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ß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)

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. � ...

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 ...

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 ...

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 ...

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 ist es notwendig, Zeiger zu verabschieden, wenn sie GO- und Viper -Bibliotheken verwenden? Warum ist es notwendig, Zeiger zu verabschieden, wenn sie GO- und Viper -Bibliotheken verwenden? Apr 02, 2025 pm 04:00 PM

Go Zeigersyntax und Probleme bei der Verwendung der Viper -Bibliothek bei der Programmierung in Go -Sprache. Es ist entscheidend, die Syntax und Verwendung von Zeigern zu verstehen, insbesondere in ...

See all articles