Le traitement parallèle dans golang
Donné le code suivant:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
for i := 0; i < 3; i++ {
go f(i)
}
//prevent main from exiting immediately
var input string
fmt.Scanln(&input)
}
func f(n int) {
for i := 0; i < 10; i++ {
dowork(n, i)
amt := time.Duration(rand.Intn(250))
time.Sleep(time.Millisecond * amt)
}
}
func dowork(goroutine, loopindex int) {
//simulate work
time.Sleep(time.Second * time.Duration(5))
fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex)
}
Puis-je supposer que l '"dowork' fonction sera exécutée en parallèle?
Est-ce une bonne façon de réaliser le parallélisme ou est-il préférable d'utiliser les canaux et séparé dowork " les travailleurs pour chaque goroutine?
- Juste au cas où quelqu'un trouve ça intéressant: Cet article qui explique comment faire en parallèle pour les boucles en Aller.
- Grand merci à ce site web se révèle être une ressource fantastique pour moi!
Vous devez vous connecter pour publier un commentaire.
Votre code sera exécuté simultanément, mais pas en parallèle. Vous pouvez le faire fonctionner en parallèle par la mise en
GOMAXPROCS
; voir l'article https://www.ardanlabs.com/blog/2014/01/concurrency-goroutines-and-gomaxprocs.html pour un bon résumé.Il n'est pas clair exactement ce que vous essayez d'accomplir ici, mais il semble comme un bon moyen de parvenir à la simultanéité de moi.
Concernant
GOMAXPROCS
, vous pouvez trouver ce à Aller de 1,5 libération de docs:Concernant la prévention de la
main
fonction de quitter immédiatement, vous pourriez tirer parti deWaitGroup
'sWait
fonction.J'ai écrit cette fonction d'utilité à l'aide de paralléliser un groupe de fonctions:
Donc dans votre cas, nous pourrions le faire
Si vous voulez utiliser la Parallélisation de la fonction, vous pouvez la trouver ici https://github.com/shomali11/util
f()
seront exécutées simultanément, mais de nombreuxdowork()
seront exécutées de façon séquentielle à l'intérieur de chaquef()
. En attente sur stdin est pas la bonne façon de s'assurer que vos routines fini de l'exécution. Vous devez faire tourner un canal que chaquef()
pousse untrue
lorsque lef()
finitions.À la fin de la
main()
vous devez attendre pour le nombre n detrue
's sur le canal. n étant le nombre def()
que vous avez lancé.sync.WaitGroup
est mieux qu'un canal pour cette affaire.Cela m'a aidé quand j'ai commencé.
"Classiques cluster à base de systèmes (tels que les supercalculateurs) emploient l'exécution parallèle entre les processeurs à l'aide de MPI. MPI est une interface de communication entre les processus qui s'exécutent dans le système d'exploitation instances sur des processeurs différents; il ne supporte pas d'autres opérations, telles que la planification. (Au risque de compliquer encore plus les choses, parce que les processus MPI sont exécutées par les systèmes d'exploitation, un seul processeur peut exécuter plusieurs processus MPI et/ou un seul processus MPI pouvez également exécuter plusieurs threads!)"