Limite d'utilisation de l'UC en python multitraitement
Je suis à l'aide de multitraitement.Piscine.imap pour exécuter de nombreux emplois indépendants en parallèle à l'aide de Python 2.7 sous Windows 7. Avec les paramètres par défaut, mon total d'utilisation de l'UC est fixé à 100%, telle que mesurée par le Gestionnaire des Tâches de Windows. De ce fait, il est impossible de faire tout autre travail alors que mon code s'exécute en arrière-plan.
J'ai essayé de limiter le nombre de processus à être le nombre de Processeurs moins 1, comme décrit dans Comment limiter le nombre de processeurs que Python utilise:
pool = Pool(processes=max(multiprocessing.cpu_count()-1, 1)
for p in pool.imap(func, iterable):
...
Ce n'est de réduire le nombre de processus en cours d'exécution. Cependant, chaque processus ne prend plus de cycles de faire pour elle. Donc, ma totale d'utilisation de l'UC est toujours fixé à 100%.
Est-il un moyen de limiter directement le total de l'utilisation de l'UC - PAS seulement le nombre de processus - ou, à défaut, est-il une solution de contournement?
- Retrait 1 de base n'est pas suffisant. En raison de la GIL, python ne consomme que 1 noyau de la valeur de temps de traitement, sauf si vous faites quelque chose fileté à l'extérieur de la GIL dans un module (par exemple, numpy) ou sous-processus. Mais le principal processus ne peut pas être complètement inactif et de Windows lui-même est quelque chose d'un porc. En fonction de ce que votre code ne et quoi d'autre est en cours d'exécution sur le système, les 2/3 de la Cpu est probablement max.
- Vous pouvez réduire la priorité des processus avec des outils win32 (exemple) ou à l'aide de la
psutil
Process.nice
. Vous obtenez toujours 100% d'utilisation, mais son moins intrusive. Vous voulez continuer à exécuter en moins de tous les cœurs. - merci, ce sont des conseils utiles! Si vous avez envie de poster un exemple de code qui combine à la piscine et psutil, ce serait certainement une excellente réponse à la question!
Vous devez vous connecter pour publier un commentaire.
La solution dépend de ce que vous voulez faire. Voici quelques options:
La faible priorité de processus
Vous pouvez
nice
le sous-processus. De cette façon, bien qu'ils continuent de manger 100% de l'UC, lorsque vous démarrer d'autres applications, le système d'exploitation donne la préférence à d'autres applications. Si vous souhaitez quitter un travail intensif de calcul fonctionner en arrière-plan de votre ordinateur portable et ne se soucient pas de la CPU ventilateur en marche tout le temps, puis en définissant la valeur de nice avecpsutils
est votre solution. Ce script est un script de test qui fonctionne sur tous les cœurs assez de temps, de sorte que vous pouvez voir comment il se comporte.Le truc, c'est que
limit_cpu
est exécuté au début de chaque processus (voirinitialisation
argment dans la doc). Alors qu'Unix a des niveaux -19 (la plus haute priorité) à 19 (le plus bas prio), Windows a quelques niveaux distincts pour donner la priorité.BELOW_NORMAL_PRIORITY_CLASS
probablement s'adapte le mieux à vos exigences, il est égalementIDLE_PRIORITY_CLASS
qui dit Windows pour exécuter votre processus uniquement lorsque le système est inactif.Vous pouvez afficher la priorité si vous passez en mode détail dans le Gestionnaire des Tâches et cliquez droit sur le processus:
Diminution du nombre de processus
Bien que vous avez rejeté cette option, cela pourrait quand même être une bonne option: Dire vous limitez le nombre de sous-processus de la moitié de l'cœurs de processeur à l'aide de
pool = Pool(max(cpu_count()//2, 1))
alors le système d'exploitation initialement d'exécution de ces processus sur la moitié de l'cœurs du processeur, tandis que les autres restent en veille, ou il suffit d'exécuter les autres applications en cours d'exécution. Après un court laps de temps, le système d'exploitation reporte le processus et peut se déplacer vers d'autres cœurs de processeur etc. Windows, Unix systèmes à base de se comporter de cette façon.Windows: les processus en cours d'Exécution 2 sur 4 cœurs:
OSX: les processus en cours d'Exécution 4 sur 8 cœurs:
Vous voyez que les deux OS de l'équilibre du processus entre les noyaux, bien que n'étant pas uniformément de sorte que vous obtenez toujours un peu de carottes avec des pourcentages plus élevés que d'autres.
Sommeil
Si vous voulez absolument aller assurer que vos processus ne mangent jamais de 100% d'une certaine base (par exemple, si vous voulez éviter que le ventilateur du cpu monte), vous pouvez alors exécuter le sommeil dans votre fonction de traitement:
Cela rend les OS "calendrier" sur votre processus de
0.01
secondes pour chaque calcul et fait de la place pour d'autres applications. Si il n'y a pas d'autres applications, le processeur est inactif, donc il ne sera jamais à 100%. Vous aurez besoin de jouer avec différentes durées de sommeil, il peut également varier d'un ordinateur à exécuter sur. Si vous voulez, il est très sophistiqué, vous pouvez alors adapter le sommeil en fonction de cecpu_times()
rapports.p.nice(psutil.BELOW_NORMAL_PRIORITY_CLASS)
serait ce que vous voulez.p.nice(19)
ne fonctionne pas sur Windows comme Windows fonctionne avec ces niveaux distinctsSur le niveau de l'OS,
vous pouvez utiliser
nice
pour définir une priorité pour une seule commande. Vous pouvez également démarrer un script python avec de belles. (Ci-dessous à partir de: http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups)Comme une fonction en Python
Une autre approche consiste à utiliser psutils pour vérifier votre charge CPU moyenne pour les dernières minutes et ensuite, demandez à votre threads de vérifier la charge CPU moyenne bobine et d'un autre thread si vous êtes en dessous de la spécifié de charge du PROCESSEUR cible, et de dormir ou de tuer le thread si vous êtes au-dessus de la charge du PROCESSEUR cible. Cela permettra de sortir de votre chemin lorsque vous utilisez votre ordinateur, mais maintenir constante la charge du PROCESSEUR.