Heim > Artikel > Backend-Entwicklung > Lassen Sie uns darüber sprechen, wie Sie mehrere Coroutinen in der Go-Sprache öffnen
In den letzten Jahren hat sich die Go-Sprache zu einer der beliebtesten Programmiersprachen im Internetbereich entwickelt und weist eine hervorragende Leistung im Bereich der Parallelität in großem Maßstab und hoher Leistung auf. Bei der Verarbeitung gleichzeitiger Anfragen ist das Öffnen mehrerer Go-Coroutinen eine wichtige Möglichkeit, die Systemleistung und Antwortgeschwindigkeit zu verbessern. Wie kann man also weitere Go-Coroutinen öffnen?
Goroutine in der Go-Sprache ähnelt Thread, ist jedoch leichter und effizienter. Mit Goroutine können wir problemlos Multitasking-Verarbeitung wie paralleles Rechnen und asynchrone E/A implementieren.
Schauen wir uns zunächst ein einfaches Beispiel an, das zeigt, wie man mit Goroutine mehrere Anfragen gleichzeitig bearbeitet:
func main() { urls := []string{ "http://www.google.com/", "http://www.apple.com/", "http://www.microsoft.com/", "http://www.facebook.com/", } for _, url := range urls { go request(url) } time.Sleep(time.Second) } func request(url string) { resp, err := http.Get(url) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(url, len(body)) }
Der obige Code zeigt, wie man den Inhalt mehrerer Websites gleichzeitig abruft. Wir verwenden Goroutine für die gleichzeitige Bearbeitung jede Anfrage. Wenn wir jedoch in tatsächlichen Anwendungen den obigen Code direkt verwenden, werden möglicherweise zu viele Goroutinen erstellt und das System kann sogar abstürzen.
Daher müssen wir die Anzahl der Goroutinen durch Optimierung steuern, damit sie innerhalb der Systemlasttoleranz ausgeführt werden können.
Zunächst können wir die Parallelität kontrollieren, indem wir die Anzahl der Goroutinen begrenzen. In der Go-Sprache können Sie Waitgroup (einen Tooltyp im Sync-Paket) verwenden, um die Anzahl der Goroutinen zu steuern.
Das Folgende ist ein Beispielprogramm:
func main() { urls := []string{ "http://www.google.com/", "http://www.apple.com/", "http://www.microsoft.com/", "http://www.facebook.com/", } var wg sync.WaitGroup for _, url := range urls { wg.Add(1) go func(url string) { request(url) wg.Done() }(url) } wg.Wait() } func request(url string) { resp, err := http.Get(url) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(url, len(body)) }
Im obigen Code wird WaitGroup verwendet, um die Anzahl der Goroutinen zu steuern. Wenn eine Goroutine die Methode waitgroup.Add(1) aufruft, bedeutet dies, dass eine Goroutine gestartet werden muss, um die Anforderung zu verarbeiten. Wenn die Goroutine die Verarbeitung der Anforderung abgeschlossen hat, muss sie die Methode waitgroup.Done() aufrufen dass eine Aufgabe erledigt wurde.
Darüber hinaus können wir auch den Puffermechanismus der go-Anweisung verwenden, um die Parallelität zu steuern. Der Kanal in der Go-Sprache kann uns dabei helfen, die Kommunikation zwischen Goroutinen zu realisieren und kann zur Steuerung der Planung zwischen Goroutinen verwendet werden. Zwischengespeicherte Kanäle können die Parallelität einschränken und dadurch die Anzahl der Goroutinen steuern.
Das Folgende ist ein Beispielprogramm:
func main() { urls := []string{ "http://www.google.com/", "http://www.apple.com/", "http://www.microsoft.com/", "http://www.facebook.com/", } var wg sync.WaitGroup ch := make(chan string, 2) for _, url := range urls { ch <- url wg.Add(1) go func() { defer wg.Done() request(<-ch) }() } wg.Wait() } func request(url string) { resp, err := http.Get(url) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(url, len(body)) }
Im obigen Code verwenden wir einen zwischengespeicherten Kanal und erstellen einen Kanal mit einer Kapazität von 2, um die Anzahl der Goroutinen zu begrenzen. Gleichzeitig verwenden wir WaitGroup, um zu warten, bis alle Goroutinen abgeschlossen sind, bevor das Programm beendet wird.
Zusammenfassend müssen Sie zum Öffnen mehrerer Go-Coroutinen Folgendes tun:
Natürlich ist das Obige nur eine Idee und Methode zum Öffnen weiterer Go-Coroutinen. In der tatsächlichen Produktion müssen wir noch optimieren und entsprechend den spezifischen Anforderungen entwerfen. Ich glaube, dass Sie mit diesem Grundwissen das Problem mehrerer Coroutinen in der Go-Sprache besser lösen können.
Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, wie Sie mehrere Coroutinen in der Go-Sprache öffnen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!