English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Go linguaggio fornisce una funzionalità speciale chiamata Goroutine. La Goroutine è unafunzioneO metodo, può essere eseguito indipendentemente e contemporaneamente con qualsiasi altra Goroutine esistente nel programma. In altre parole, ogni attività eseguita contemporaneamente in Go si chiama Goroutine, puoi considerare la Goroutine come un thread leggero. rispetto ai thread, il costo di creazione delle Goroutine è molto basso. Ogni programma contiene almeno una Goroutine, e questa Goroutine si chiamaGoroutine principaleSe la Goroutine principale termina, tutte le Goroutine sottostanti alla Goroutine principale termineranno; le Goroutine sempre in esecuzione in background.
Puoi usare la parola chiave go come prefisso per chiamare una funzione o un metodo per creare la tua Goroutine, come mostrato nella seguente sintassi:
Sintassi:
func name() { //Stato } // Prima del nome della funzione, utilizzare la parola chiave go go name()
package main import "fmt" func display(str string) { for w := 0; w < 6; w++ { fmt.Println(str) } } func main() { // Chiamata a Goroutine go display("Benvenuto") // Chiamata normale della funzione display("oldtoolbag.com") }
Output:
oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com
Nel esempio sopra, abbiamo creato solodisplay()Funzione, quindi chiamata in due modi diversi, il primo è la Goroutine, ovvero go display("Welcome") e il secondo è la chiamata convenzionale della funzione, ovvero display("w3codebox")
Ma potresti aver riscontrato un problema, mostra solo il risultato della chiamata a una funzione comune, non il risultato della Goroutine, perché quando si esegue una nuova Goroutine, la chiamata alla Goroutine ritorna immediatamente. Non aspetta come una funzione comune che aspetta la fine dell'esecuzione della Goroutine, continuano sempre alla riga successiva dopo la chiamata alla Goroutine e ignorano il valore di ritorno della Goroutine. Pertanto, per eseguire correttamente la Goroutine, abbiamo apportato alcune modifiche al programma, come mostrato nel seguente codice:
Esempio di Goroutine modificato:
package main import ( "fmt" "time" ) func display(str string) { for w := 0; w < 6; w++ { time.Sleep(1 * time.Second) fmt.Println(str) } } func main() { // Chiamata a Goroutine go display("Benvenuto") //Chiamata di funzione comune display("w3codebox") }
Output:
Benvenuto w3codebox w3codebox Benvenuto Benvenuto w3codebox w3codebox Benvenuto Benvenuto w3codebox w3codebox
Abbiamo aggiunto il metodo Sleep() nel nostro programma, che fa dormire la Goroutine principale per 1 secondo durante l'esecuzione della nuova Goroutine, visualizzando il benvenuto a schermo, poi la Goroutine principale viene riaggiustata e esegue le sue operazioni per 1 secondo e termina. Questo processo continua fino a che il valore di z è minore di 6, dopodiché la Goroutine principale termina. In questo caso, la Goroutine e la funzione normale lavorano insieme.
Le Goroutine hanno un minor costo rispetto ai thread.
Le Goroutine si trovano nella pila, e la dimensione della pila può aumentare e diminuire in base alle esigenze del programma. Ma nella thread, la dimensione della pila è fissa.
Le Goroutine possono comunicare tramite canali, e questi canali sono progettati in modo specifico per prevenire conflitti quando si accede a memoria condivisa tramite Goroutines.
Supponiamo che un programma abbia un thread e che il thread abbia molte Goroutine associate. Se una Goroutine blocca il thread per esigenze di risorse, tutte le altre Goroutine vengono assegnate a un nuovo thread OS. Tutti questi dettagli sono nascosti al programmatore.
In Go, puoi anche avviare una Goroutine per un'funzione anonima, in altre parole, puoi semplicemente creare una Goroutine anonima usando la parola chiave go come prefisso della funzione, come mostrato nella seguente sintassi:
Sintassi:
//Chiamata di funzione anonima go func(parametro_list){ //Stato }(argomenti)
package main import ( "fmt" "time" ) func main() { fmt.Println("Benvenuto!! a funzione Principale") //Creazione di una Goroutine anonima go func() { fmt.Println("Benvenuto!! su oldtoolbag.com") }() time.Sleep(1 * time.Second) fmt.Println("Ciao!! a funzione Principale") }
Output:
Benvenuto!! a funzione Principale Benvenuto!! su oldtoolbag.com Ciao!! a funzione Principale