Heim  >  Artikel  >  Backend-Entwicklung  >  So führen Sie Parallelität in der Go-Sprache durch

So führen Sie Parallelität in der Go-Sprache durch

青灯夜游
青灯夜游Original
2023-01-18 14:19:011771Durchsuche

Die Go-Sprache unterstützt Parallelitätsfunktionen über die Compiler-Laufzeit; die Parallelität wird durch Goroutine vervollständigt. Goroutine ist eine sehr leichte Implementierung, die Tausende gleichzeitiger Aufgaben in einem einzigen Prozess ausführen kann. Sie ist der Kern des Parallelitätsdesigns der Go-Sprache. Sie können eine Goroutine mit dem Schlüsselwort go erstellen, die go-Deklaration vor einer Funktion platzieren, die aufgerufen werden muss, und die Funktion im selben Adressraum aufrufen und ausführen, sodass die Funktion als unabhängiger gleichzeitiger Thread ausgeführt wird.

So führen Sie Parallelität in der Go-Sprache durch

Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.

Parallelität bedeutet, dass mehrere Aufgaben gleichzeitig ausgeführt werden können. Gleichzeitige Programmierung hat eine weitreichende Bedeutung, einschließlich Multithread-Programmierung, Multiprozessprogrammierung und verteilter Programme.

Die Go-Sprache unterstützt Parallelitätsfunktionen über die Compiler-Laufzeit. Die Parallelität in der Go-Sprache wird durch die Goroutine-Funktion erreicht. Goroutinen ähneln Threads, es können jedoch mehrere Goroutinen erstellt werden, um bei Bedarf gleichzeitig zu arbeiten. Goroutine wird von der Laufzeit der Go-Sprache geplant, während Threads vom Betriebssystem geplant werden.

Die Go-Sprache bietet auch Kanäle für die Kommunikation zwischen mehreren Goroutinen. Goroutine und Channel sind wichtige Implementierungsgrundlagen für das CSP-Parallelitätsmodell (Communicating Sequential Process), das von der Go-Sprache eingehalten wird.

Goroutine-Einführung

goroutine ist eine sehr leichte Implementierung, die Tausende gleichzeitiger Aufgaben in einem einzigen Prozess ausführen kann. Sie ist der Kern des Parallelitätsdesigns der Go-Sprache.

Letztendlich ist Goroutine eigentlich ein Thread, aber er ist kleiner als ein Thread. Ein Dutzend Goroutinen können sich in fünf oder sechs Threads auf der untersten Ebene widerspiegeln, und die Go-Sprache implementiert auch die gemeinsame Nutzung des Speichers zwischen Goroutinen.

Verwenden Sie das Schlüsselwort go, um eine Goroutine zu erstellen, setzen Sie die go-Deklaration vor eine Funktion, die aufgerufen werden muss, und rufen Sie diese Funktion im selben Adressraum auf und führen Sie sie aus, sodass sie bei der Ausführung als unabhängige Funktion fungiert Gleichzeitiger Thread wird in der Go-Sprache als Goroutine bezeichnet.

goroutine wird wie folgt verwendet:

//go 关键字放在方法调用前新建一个 goroutine 并执行方法体
go GetThingDone(param1, param2);
//新建一个匿名方法并执行
go func(param1, param2) {
}(val1, val2)
//直接新建一个 goroutine 并在 goroutine 中执行代码块
go {
    //do someting...
}

Da Goroutine in einer Multi-Core-CPU-Umgebung parallel ist, haben wir Codeparallelität erreicht, wenn der Codeblock in mehreren Goroutinen ausgeführt wird.

Wenn Sie die Ausführung des Programms wissen müssen, wie erhalten Sie die parallelen Ergebnisse? Es muss in Verbindung mit dem Kanal verwendet werden.

channel

channel ist die Kommunikationsmethode zwischen Goroutinen, die von der Go-Sprache auf Sprachebene bereitgestellt wird. Wir können Kanäle verwenden, um Nachrichten zwischen zwei oder mehr Goroutinen weiterzuleiten.

channel ist eine prozessinterne Kommunikationsmethode, sodass der Prozess der Übergabe von Objekten durch Kanäle mit dem Parameterübergabeverhalten beim Aufrufen von Funktionen übereinstimmt. Beispielsweise können auch Zeiger übergeben werden. Wenn eine prozessübergreifende Kommunikation erforderlich ist, empfehlen wir die Verwendung eines verteilten Systemansatzes, beispielsweise die Verwendung von Kommunikationsprotokollen wie Socket oder HTTP. Die Go-Sprache bietet auch eine sehr vollständige Unterstützung für das Internet.

Kanal ist typbezogen, das heißt, ein Kanal kann nur einen Werttyp übergeben, und dieser Typ muss bei der Kanaldeklaration angegeben werden. Wenn Sie etwas über Unix-Pipes wissen, ist es nicht schwer, den Kanal zu verstehen, der als typsichere Pipe betrachtet werden kann.

Beim Definieren eines Kanals müssen Sie auch die Art des an den Kanal gesendeten Werts definieren. Beachten Sie, dass Sie make zum Erstellen des Kanals verwenden müssen:

ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

Zurück in die Antike vor Windows und Linux Bei der Entwicklung von Programmen gibt es kein Konzept der Parallelität, da die zwingende Programmiersprache auf der Serialisierung basiert. Das Programm führt jede Anweisung nacheinander aus. Das gesamte Programm verfügt nur über einen Aufrufstapel und einen Heap.

Parallelität bedeutet, dass das Programm zur Laufzeit über mehrere Ausführungskontexte verfügt, die mehreren Aufrufstapeln entsprechen. Wir wissen, dass jeder Prozess, wenn er ausgeführt wird, über einen eigenen Aufrufstapel und Heap sowie einen vollständigen Kontext verfügt. Wenn das Betriebssystem einen Prozess plant, speichert es den Kontext des geplanten Prozesses Stellen Sie den Kontext des Prozesses im System wieder her.

Aus Sicht des gesamten Betriebssystems können mehrere Prozesse gleichzeitig ablaufen. Welchen Wert hat die Parallelität? Schauen wir uns zunächst die folgenden Szenarien an.

1) Einerseits benötigen wir eine reaktionsfähige grafische Benutzeroberfläche. Andererseits muss das Programm auch eine große Anzahl von Vorgängen oder E/A-intensiven Vorgängen ausführen, und wir müssen dafür sorgen, dass die Schnittstelle reagiert und Vorgänge ausführt gleichzeitig.

2) Wenn unser Webserver mit einer großen Anzahl von Benutzeranfragen konfrontiert ist, sind mehr „Webserver-Arbeitseinheiten“ erforderlich, um jeweils auf Benutzer zu reagieren.

3) Unsere Transaktionen finden in einer verteilten Umgebung statt. Die gleiche Arbeitseinheit verarbeitet Shard-Daten auf verschiedenen Computern. Die CPU des Computers entwickelt sich vom Single-Core zum Multi-Core, und unsere Programme sind seriell, die Fähigkeiten der Computer-Hardware werden nicht genutzt.

4) Unser Programm ist aufgrund von E/A-Vorgängen blockiert, das gesamte Programm befindet sich in einem stagnierenden Zustand und andere Aufgaben, die nichts mit E/A zu tun haben, können nicht ausgeführt werden.

Wie Sie an den obigen Beispielen sehen können, können serielle Programme in vielen Szenarien unsere Anforderungen nicht erfüllen. Nachfolgend haben wir einige Vorteile gleichzeitiger Programme zusammengefasst, um allen klar zu machen, dass Parallelität unerlässlich ist:

  • Parallelität kann das Problemmodell objektiver darstellen;

  • Parallelität kann die Vorteile des CPU-Kerns voll ausnutzen und verbessern Effizienz des Programms.

  • Parallelität kann die inhärente Asynchronität zwischen der CPU und anderen Hardwaregeräten voll ausnutzen.

【Verwandte Empfehlungen: Go-Video-Tutorial, Programmierunterricht

Das obige ist der detaillierte Inhalt vonSo führen Sie Parallelität in der Go-Sprache durch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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