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!