Enthüllte Funktionen der Golang-Sprache: Paralleles Rechnen und Parallelitätsmodell

王林
Freigeben: 2023-07-18 23:39:26
Original
957 Leute haben es durchsucht

Golang-Sprachfunktionen enthüllt: Paralleles Computing und Parallelitätsmodell

Go-Sprache (Golang) ist eine von Google entwickelte Open-Source-Programmiersprache und bekannt für ihr einfaches und effizientes Design und ihre hervorragende Parallelitätsunterstützung. In diesem Artikel untersuchen wir die Parallel-Computing- und Parallelitätsmodelle von Golang und wie sie zur Verbesserung der Leistung Ihrer Programme verwendet werden können.

1. Paralleles Rechnen

Paralleles Rechnen bezieht sich auf die Fähigkeit, mehrere Rechenaufgaben gleichzeitig auszuführen. Es beschleunigt die Programmausführung durch die Nutzung mehrerer Prozessoren oder Prozessorkerne. In Golang können wir Goroutinen und Kanäle verwenden, um paralleles Rechnen zu implementieren.

  1. Goroutine

Goroutine ist eine leichte Ausführungseinheit in Golang, die gleichzeitig mit anderen Goroutinen ausgeführt werden kann. Im Vergleich zu Betriebssystem-Threads werden Goroutinen schneller gestartet und zerstört und beanspruchen weniger Speicher. Eine Goroutine kann mit dem Schlüsselwort go erstellt werden.

Hier ist ein Beispielcode, der Goroutine zur Berechnung der Fibonacci-Folge verwendet:

package main

import (
    "fmt"
)

func Fibonacci(n int, c chan int) {
    x, y := 0, 1
    for i := 0; i < n; i++ {
        c <- x
        x, y = y, x+y
    }
    close(c)
}

func main() {
    c := make(chan int)
    go Fibonacci(10, c)
    for i := range c {
        fmt.Println(i)
    }
}
Nach dem Login kopieren

Im obigen Beispiel haben wir eine Goroutine zur Berechnung der Fibonacci-Folge erstellt und die Berechnungsergebnisse über einen Kanal an den Hauptthread gesendet. Der Hauptthread liest über das Schlüsselwort „range“ Daten aus dem Kanal und gibt sie auf der Konsole aus.

  1. Channel

Channel kann als Pipeline für die Kommunikation zwischen Goroutinen verwendet werden. Es bietet einen sicheren Mechanismus für den gleichzeitigen Zugriff, der verhindert, dass mehrere Goroutinen gleichzeitig auf gemeinsam genutzte Daten zugreifen und diese ändern.

In Golang können Sie die Make-Funktion verwenden, um einen Kanal zu erstellen. Kanäle können gepuffert oder ungepuffert sein. Gepufferte Kanäle können eine bestimmte Datenmenge speichern, während ungepufferte Kanäle jeweils nur ein Datenelement speichern können.

Hier ist ein Beispielcode für die Verwendung von Kanälen für parallele Berechnungen:

package main

import (
    "fmt"
    "time"
)

func calculateSquare(number int, c chan int) {
    time.Sleep(1 * time.Second)
    c <- number * number
}

func main() {
    startTime := time.Now()

    c := make(chan int)

    for i := 1; i <= 3; i++ {
        go calculateSquare(i, c)
    }

    for i := 1; i <= 3; i++ {
        fmt.Println(<-c)
    }

    endTime := time.Now()
    elapsedTime := endTime.Sub(startTime)
    fmt.Printf("总计算时间:%s
", elapsedTime)
}
Nach dem Login kopieren

Im obigen Beispiel erstellen wir eine Funktion, die das Quadrat berechnet und das Berechnungsergebnis in den Kanal sendet. Anschließend werden im Hauptthread drei Goroutinen erstellt, um Berechnungsaufgaben gleichzeitig auszuführen, und die Ergebnisse werden zum Drucken über den Kanal in den Hauptthread eingelesen. Schließlich verwenden wir das Zeitpaket, um die Gesamtrechenzeit des Programms zu berechnen und auszudrucken.

2. Parallelitätsmodell

Parallelität bedeutet, dass mehrere Aufgaben abwechselnd, jedoch nicht unbedingt gleichzeitig, ausgeführt werden. Ein Parallelitätsmodell ist eine Methode zum Verwalten und Planen mehrerer gleichzeitiger Aufgaben. In Golang können wir Mutex-Sperren (Mutex) und Lese-/Schreibsperren (RWMutex) verwenden, um einen gleichzeitigen Datenzugriff zu erreichen.

  1. Mutex (Mutex)

Mutex wird zum Schutz gemeinsam genutzter Ressourcen verwendet. Nur eine Goroutine darf auf gemeinsam genutzte Ressourcen zugreifen, und andere Goroutinen müssen auf die Freigabe des Mutex warten, bevor sie darauf zugreifen können. Mutex-Sperren können mit dem Mutex-Typ aus dem Sync-Paket erstellt werden.

Das Folgende ist ein Beispielcode, der einen Mutex verwendet, um den gleichzeitigen Zugriff auf gemeinsam genutzte Ressourcen zu implementieren:

package main

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

var count int
var mutex sync.Mutex

func increment() {
    mutex.Lock()
    defer mutex.Unlock()
    count++
    fmt.Println(count)
}

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

    time.Sleep(2 * time.Second)
    fmt.Printf("最终值:%d
", count)
}
Nach dem Login kopieren

Im obigen Beispiel haben wir eine globale Variablenanzahl erstellt und einen Mutex verwendet, um den gleichzeitigen Zugriff zu schützen. Verwenden Sie in jeder Goroutine zunächst die Lock-Methode, um die Mutex-Sperre zu erhalten, und verwenden Sie dann die Unlock-Methode, um die Mutex-Sperre aufzuheben, nachdem die Funktion beendet ist. Zum Schluss drucken wir den Endwert von count aus.

  1. Lese-/Schreibsperre (RWMutex)

Die Lese-/Schreibsperre wird verwendet, um Lese- und Schreibvorgänge auf gemeinsam genutzten Ressourcen abzuwickeln. Im Gegensatz zu einem Mutex können bei Lesevorgängen mehrere Goroutinen gleichzeitig auf eine gemeinsam genutzte Ressource zugreifen, bei Schreibvorgängen kann jedoch nur eine Goroutine darauf zugreifen. Lese-/Schreibsperren können mit dem Typ RWMutex aus dem Sync-Paket erstellt werden.

Das Folgende ist ein Beispielcode, der Lese-/Schreibsperren verwendet, um das gleichzeitige Lesen und Schreiben gemeinsam genutzter Ressourcen zu implementieren:

package main

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

var count int
var rwMutex sync.RWMutex

func read() {
    rwMutex.RLock()
    defer rwMutex.RUnlock()
    fmt.Println(count)
}

func write() {
    rwMutex.Lock()
    defer rwMutex.Unlock()
    count++
}

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

    time.Sleep(2 * time.Second)
}
Nach dem Login kopieren

Im obigen Beispiel haben wir eine globale Variablenanzahl erstellt und Lese-/Schreibsperren verwendet, um das gleichzeitige Lesen und Schreiben zu schützen Schreiben. In jeder Goroutine verwenden wir die RLock-Methode, um die Lesesperre für Lesevorgänge zu erhalten, und die Lock-Methode, um die Schreibsperre für Schreibvorgänge zu erhalten. Schließlich nutzen wir das Zeitpaket, um sicherzustellen, dass die Goroutine genügend Zeit zur Ausführung hat.

Zusammenfassung:

Golang bietet leistungsstarke Unterstützung für Parallelverarbeitung und Parallelitätsmodelle, sodass wir die Leistung von Mehrkernprozessoren und Prozessorkernen besser nutzen können. Durch die Verwendung von Goroutinen und Kanälen zur Implementierung paralleler Datenverarbeitung können wir schnell und einfach effiziente gleichzeitige Programme implementieren. Durch die Verwendung von Mutex-Sperren und Lese-/Schreibsperren zur Verwaltung des gleichzeitigen Zugriffs auf gemeinsam genutzte Ressourcen können Datenkonsistenz und -zuverlässigkeit sichergestellt werden. Durch das Verständnis und die Verwendung des Parallel-Computing- und Parallelitätsmodells von Golang können wir die Leistung und Reaktionsfähigkeit unserer Programme besser verbessern.

Das obige ist der detaillierte Inhalt vonEnthüllte Funktionen der Golang-Sprache: Paralleles Rechnen und Parallelitätsmodell. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!