Asynchrone Golang-Methode: 1. Gleichzeitiger Anforderungs-/Antwortmodus, bei dem eine Goroutine eine Anfrage an eine andere Goroutine sendet und dann auf die Antwort wartet; 2. Bei dem mehrere Goroutinen Daten von einem Kanal empfangen und das Ergebnis an einen anderen senden nach der Verarbeitung des Kanals.
Die Betriebsumgebung dieses Tutorials: Windows10-System, Golang1.20.1-Version, DELL G3-Computer.
Golang ist eine leistungsstarke und effiziente Programmiersprache, die einen umfangreichen Mechanismus für die gleichzeitige Programmierung bietet. Eine ihrer wichtigen Funktionen ist die asynchrone Programmierung. Asynchrone Programmierung kann Entwicklern helfen, die Leistung und Skalierbarkeit von Programmen zu verbessern und gleichzeitig ein besseres Benutzererlebnis zu bieten. In diesem Artikel besprechen wir, wie man asynchrone Programmierung in Golang implementiert.
In Golang kann asynchrone Programmierung über Goroutine und Channel implementiert werden. Goroutine ist ein leichter Thread, der in einer gleichzeitigen Ausführungsumgebung ausgeführt werden kann, und Channel ist eine Pipeline, die für die Kommunikation zwischen Goroutinen verwendet wird.
1. Lassen Sie uns Goroutine vorstellen. Goroutine ist ein leichtgewichtiger Thread, der von der Laufzeitumgebung der Go-Sprache verwaltet wird. Mit Goroutinen können Sie mehrere Funktionen gleichzeitig in einem Programm ausführen, ohne zusätzliche Threads zu erstellen. Starten Sie eine Goroutine mit dem Schlüsselwort go, zum Beispiel:
gofuncName()
Im obigen Beispiel ist funcName ein Funktionsname, und durch Aufrufen des Schlüsselworts go wird die Funktion asynchron in einer neuen Goroutine ausgeführt. Durch die Verwendung von Goroutine kann das Programm mehrere Funktionen gleichzeitig ausführen, wodurch die Parallelitätsleistung des Programms verbessert wird.
2. Werfen wir einen Blick auf den Kanal. Der Kanal ist die Brücke für die Kommunikation zwischen Goroutinen. Es kann zum Senden und Empfangen von Werten verwendet werden und ermöglicht so die Synchronisierung zwischen verschiedenen Goroutinen. In Golang können Sie die Make-Funktion verwenden, um einen Kanal zu erstellen, zum Beispiel:
ch:=make(chandataType)
Im obigen Beispiel ist dataType der Datentyp, den der Kanal empfangen kann. Die Synchronisierung zwischen Goroutinen kann mithilfe von Kanälen erreicht werden, zum Beispiel:
ch<-value//发送数据到channel result:=<-ch//从channel接收数据
Im obigen Beispiel ist ch <- value bedeutet das Senden eines Werts an den Kanal und <-ch bedeutet das Empfangen von Daten vom Kanal. Kanäle können verwendet werden, um eine Synchronisierung und Datenübertragung zwischen zwei oder mehr Goroutinen zu erreichen.
3. Wir werden einige gängige asynchrone Programmiermuster vorstellen. Das erste ist das gleichzeitige Anfrage/Antwort-Muster, bei dem eine Goroutine eine Anfrage an eine andere Goroutine sendet und dann auf eine Antwort wartet. Dies kann beispielsweise mithilfe von Goroutinen und Kanälen erreicht werden:
funcworker(requestchanint,responsechanint){ for{ req:=<-request//从channel接收请求 //处理请求 result:=req*2//假设这是一个耗时的操作 response<-result//发送响应到channel } } funcmain(){ request:=make(chanint) response:=make(chanint) goworker(request,response) //发送请求 request<-10 //等待响应 result:=<-response fmt.Println(result)//输出20 }
Im obigen Beispiel erhält die Worker-Funktion zwei Kanäle, Anfrage und Antwort, als Parameter. Es verwendet eine Endlosschleife, um auf Anfragen zu warten Kanal und bearbeiten die Anfrage. Das Ergebnis wird dann an den Antwortkanal gesendet. Die Hauptfunktion erstellt Anfrage und Antwort Kanal und startete die Goroutine der Worker-Funktion. Die Hauptfunktion sendet 10 zur Anfrage Kanal, warten Sie dann auf die Antwort des Arbeiters und drucken Sie das Ergebnis aus.
Ein weiteres häufiges Muster ist das Fan-Out/Fan-In-Muster, bei dem mehrere Goroutinen Daten von einem Kanal empfangen und das Ergebnis nach der Verarbeitung an einen anderen Kanal senden. Dies kann dazu beitragen, die Verarbeitungsgeschwindigkeit und den Durchsatz des Programms zu verbessern, zum Beispiel:
funcworker(inputchanint,outputchanint){ for{ data:=<-input//从channel接收数据 //处理数据 result:=data*2//假设这是一个耗时的操作 output<-result//发送结果到channel } } funcmain(){ input:=make(chanint) output:=make(chanint) fori:=0;i<10;i++{ goworker(input,output) } //发送数据 fori:=0;i<10;i++{ input<-i } //等待处理结果 fori:=0;i<10;i++{ result:=<-output fmt.Println(result) } }
Im obigen Beispiel empfängt die Worker-Funktion Daten vom Eingabekanal und sendet das Ergebnis nach der Verarbeitung an die Ausgabe Kanal. Die Main-Funktion erstellt Eingabe und Ausgabe Kanal und startete 10 Worker-Goroutinen. Die Hauptfunktion sendet Daten von 0 bis 9 an den Eingang Kanal und warten Sie auf das Verarbeitungsergebnis. Die Verarbeitungsergebnisse werden vom Ausgabekanal empfangen und gedruckt.
Neben der Verwendung von Goroutinen und Kanälen bietet Golang auch einige andere Parallelitätskontroll- und Synchronisationsmechanismen, wie Mutex-Sperren (sync.Mutex), Bedingungsvariablen (sync.Cond), atomare Operationen (atomic) usw. Diese Mechanismen können Entwicklern dabei helfen, den gleichzeitigen Zugriff effektiv zu verwalten und gemeinsam genutzte Ressourcen zu betreiben.
In tatsächlichen Anwendungen kann die korrekte Verwendung der asynchronen Programmierung die Leistung und Skalierbarkeit des Programms erheblich verbessern. Entwickler sollten den geeigneten Parallelitätsmodus entsprechend der tatsächlichen Situation auswählen und die Probleme des gleichzeitigen Zugriffs und gemeinsam genutzter Ressourcen sorgfältig behandeln.
Zusammenfassend lässt sich sagen, dass Golang einen leistungsstarken Mechanismus für die gleichzeitige Programmierung bietet, wobei die asynchrone Programmierung eines der Hauptmerkmale ist. Durch die Verwendung von Goroutinen und Kanälen können asynchrone Programmierung und Parallelitätskontrolle einfach implementiert werden. In tatsächlichen Anwendungen sollten Entwickler den geeigneten Parallelitätsmodus entsprechend der tatsächlichen Situation auswählen, um die Leistung und Skalierbarkeit des Programms zu verbessern .
Das obige ist der detaillierte Inhalt vonSo machen Sie Golang asynchron. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!