web-dev-qa-db-fra.com

Comment mon programme Go peut-il occuper tous les cœurs de processeur?

Les Goroutines sont des processus légers qui sont automatiquement découpés dans un ou plusieurs threads du système d'exploitation lors de l'exécution de Go. (Ceci est un vraiment cool fonctionnalité de Go!)

Supposons que j'ai une application concurrente, telle qu'un serveur Web. Il y a beaucoup de choses qui se passent simultanément dans mon programme hypothétique, sans beaucoup de ratio non concomitant (loi d'Amdahl).

Il semble que le nombre par défaut de threads du système d'exploitation utilisés soit actuellement égal à 1. Cela signifie-t-il qu'un seul cœur de processeur est utilisé?

Si je commence mon programme avec

runtime.GOMAXPROCS(runtime.NumCPU())

cela donnera-t-il une utilisation raisonnablement efficace de tous des cœurs sur mon PC?

Existe-t-il un avantage à "avoir du jeu en parallèle" grâce à l’utilisation des threads voire plus / OS, par ex. via une heuristique

runtime.GOMAXPROCS(runtime.NumCPU() * 2)

?

29
Rick-777

On ne peut pas répondre à cette question, elle est beaucoup trop large.

Prenez votre problème, votre algorithme et votre charge de travail et mesurez ce qui convient le mieux à cette combinaison.

Personne ne peut répondre à une question du type "Y a-t-il une heuristique selon laquelle ajouter deux fois plus de sel à mon déjeuner le rendra meilleur?" comme cela dépend du déjeuner (les tomates bénéficient beaucoup plus du sel que les fraises), votre goût et la quantité de sel déjà présente. Essayez-le.

Sur more: runtime.GOMAXPROCS(runtime.NumCPU()) a atteint le statut de secte mais le contrôle du nombre de threads en définissant la variable d'environnement GOMAXPROCS à partir de outside pourrait être l'option bien meilleure.

4
Volker

runtime.GOMAXPROCS() définit le nombre de cœurs de processeur (virtuels) que votre programme peut utiliser simultanément. Permettre à Go d'utiliser plus de cœurs de processeur que ce que vous avez réellement ne vous aidera pas, car votre système ne compte qu'un nombre aussi réduit de cœurs de processeur.

Afin de fonctionner dans plusieurs threads, votre programme doit avoir plusieurs goroutines, généralement des appels de fonction avec go someFunc(). Si votre programme ne démarre pas de goroutines supplémentaires, il ne fonctionnera naturellement que dans un seul thread, quel que soit le nombre de processeurs/cœurs que vous lui permettez d'utiliser.

Découvrez ceci et les exercices suivants sur la création de goroutines.

0
sjakobi