Mentre SayHello()
si esegue come previsto, la goroutine non stampa nulla.Nessun output da goroutine in Go
risposta
Quando la funzione main()
termina, anche il programma termina. Non aspetta che le altre goroutine finiscano.
Citando dalla Go Language Specification: Program Execution:
L'esecuzione del programma inizia inizializzando il pacchetto principale e quindi invocando la funzione
main
. Al termine di tale chiamata, il programma termina. Non attende altre goreutine (nonmain
) da completare.
Vedere this answer per ulteriori dettagli.
Devi dire alla tua funzione main()
di aspettare che la funzione SayHello()
sia stata avviata come una goroutine da completare. È possibile eseguire la sincronizzazione con canali ad esempio:
func SayHello(done chan int) {
for i := 0; i < 10; i++ {
fmt.Print(i, " ")
}
if done != nil {
done <- 0 // Signal that we're done
}
}
func main() {
SayHello(nil) // Passing nil: we don't want notification here
done := make(chan int)
go SayHello(done)
<-done // Wait until done signal arrives
}
Un'altra alternativa è quella di segnalare il completamento chiudendo il canale:
func SayHello(done chan struct{}) {
for i := 0; i < 10; i++ {
fmt.Print(i, " ")
}
if done != nil {
close(done) // Signal that we're done
}
}
func main() {
SayHello(nil) // Passing nil: we don't want notification here
done := make(chan struct{})
go SayHello(done)
<-done // A receive from a closed channel returns the zero value immediately
}
Note:
Secondo le modifiche/commenti: se si desidera che le 2 funzioni in esecuzione SayHello()
stampino in modo casuale numeri "misti": non si ha alcuna garanzia di osservare tale comportamento. Ancora una volta, vedi lo aforementioned answer per maggiori dettagli. Lo Go Memory Model garantisce solo che determinati eventi si verifichino prima di altri eventi, non si ha alcuna garanzia di come vengano eseguite 2 goroutine concorrenti.
Si potrebbe sperimentare, ma sapere che il risultato non sarà deterministico. In primo luogo si deve consentire a più goroutines attivi da eseguire con:
runtime.GOMAXPROCS(2)
E in secondo luogo si deve iniziare prima SayHello()
come goroutine perché il codice attuale eseguito per primo SayHello()
nella goroutine principale e solo una volta è finito inizia l'altra uno:
runtime.GOMAXPROCS(2)
done := make(chan struct{})
go SayHello(done) // FIRST START goroutine
SayHello(nil) // And then call SayHello() in the main goroutine
<-done // Wait for completion
Giusto, ho appena capito la tua modifica dopo aver letto http://dave.cheney.net/2014/03/19/channel- assiomi: Un invio ai blocchi di canale 'nil' per sempre, Una ricezione da blocchi di canale' nil' per sempre. – VonC
@ icza per favore controlla le modifiche. –
@DineshPanchananam Cosa intendi per moda "disordinata"? Ti aspetti di vedere numeri misti casualmente dalle 2 funzioni 'SayHello()' in esecuzione? – icza
alternativa (alla risposta di icza) si possono usare WaitGroup
da sync
confezione e funzione anonima per non alterare originale SayHello
.
package main
import (
"fmt"
"sync"
)
func SayHello() {
for i := 0; i < 10; i++ {
fmt.Print(i, " ")
}
}
func main() {
SayHello()
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
SayHello()
}()
wg.Wait()
}
Per stampare i numeri contemporaneamente eseguire ogni istruzione di stampa nella routine separata come il seguente
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(fnScopeI int) {
defer wg.Done()
// next two strings are here just to show routines work simultaneously
amt := time.Duration(rand.Intn(250))
time.Sleep(time.Millisecond * amt)
fmt.Print(fnScopeI, " ")
}(i)
}
wg.Wait()
}
per favore controlla le modifiche –
@DineshPanchananam vuoi stampare ogni numero in una routine separata? – Sundrique
No. mi aspettavo qualcosa "" parallelo "" "., Ma penso di essermi sbagliato –
- 1. Nessun output da DebugView
- 2. Nessun output da PHP interattivo su Windows
- 3. GO language: errore fatale: tutte le goroutine sono addormentate - deadlock
- 4. Il lancio di goroutine all'interno delle goroutine è accettabile?
- 5. Come funzionano le goroutine?
- 6. Nessun output dell'applicazione in QtCreator debug
- 7. Capire le goroutine
- 8. Cosa succede per restituire il valore da goroutine
- 9. Go ha qualcosa come ThreadLocal da Java?
- 10. Test Golang Goroutine
- 11. Posso utilizzare Goroutine in Google App Engine?
- 12. Python, sottoprocesso, devenv, perché nessun output?
- 13. qual è la differenza principale tra .net Async e go go go thread leggero
- 14. Entity Framework Migrations: includendo istruzione Go solo in -Script output
- 15. Quali sono le tre goroutine di sfondo in un programma Go?
- 16. annullare un'operazione di blocco in Go
- 17. Seleziona all'interno di goroutine valuta ogni altra istruzione
- 18. Nessun output Log4J in sbt quando si utilizza lo scalatest
- 19. Utilizzare le goroutine di Google Go per creare una rete Bayes
- 20. Come utilizzare un pool di goroutine
- 21. Dove scrivere su stdout go quando lanciato da una shell cygwin, nessun reindirizzamento
- 22. API Android da Go
- 23. Nessun file di origine Go buildable nella cartella
- 24. Perdita di memoria Golang relativa alle goroutine
- 25. goroutine non viene eseguito se time.sleep incluso
- 26. Output XML da MySQL
- 27. compito polling pianificata in Go
- 28. trasmesso da float32 a int in Go
- 29. Nessun output quando si utilizza `fprintf 'dopo` fwprintf'
- 30. Implementazione di promessa con i canali in Go
possibile duplicato del [goroutine non esegue se time.sleep inclusa] (http: // StackOverflow. it/questions/28307783/goroutine-does-not-execute-if-time-sleep-incluso) –