Comment puis-je réduire l'utilisation du processeur pour ce programme Python?

15

Je vais avoir un Python exécuté 24/7 dans une boucle while, voici un exemple du genre de programme:

while True:

    print ("me again...")

Mais quand je l'exécute, mon processeur passe à 100%! Mais je ne veux pas cela car mon programme fonctionnera pendant de longues périodes, etc. et je ne veux pas que mon processeur devienne très chaud, est-ce que je peux empêcher cela?

user151324
la source
3
sans attendre le CPU va à 100% car c'est ce que vous lui avez dit de faire :) imprimer aussi vite que possible. Attendre aidera donc à décharger ce fardeau. l'impression, est généralement une opération très coûteuse. écrire dans un fichier est beaucoup moins cher.
Piotr Kula
Vous devez indiquer au système d'exploitation que vous ne voulez pas de cycles de processeur pour une période de temps donnée, sinon vous ne pouvez rien faire pour éviter ce que vous voyez.
Thorbjørn Ravn Andersen

Réponses:

16

À la fin de votre boucle, ayez un

time.sleep(xx)pour les secondes, ou time.sleep(x.x)pour représenter des secondes partielles

(S'il vous plaît rappelez-vous d'importer le temps bibliothèque, comme suit: import time)

Avec xx étant aussi élevé que possible sans nuire à votre programme. En ce moment, votre programme fait toujours tout aussi vite qu'il le peut, plutôt que de donner du temps au Pi pour se reposer ou faire autre chose.

Beurres
la source
Hmmmm ... Très intéressant ... Je vais l'essayer. Merci! Je ne peux pas croire que je n'y ai pas pensé!
user151324
Y a-t-il une bibliothèque à importer, etc.? Je reçois une erreur indiquant que l'heure n'est pas définie
user151324
@coding_corgi oui, vous avez besoin de la bibliothèque de temps.
Butters
2
Alors import time?
user151324
@coding_corgi. Oui c'est correct.
Butters
14

Préface

Assurez-vous que vous devez vraiment exécuter votre tâche à plusieurs reprises. Ceci est appelé attente occupée et presque toujours sous-optimal. Si votre tâche vérifie la sortie d'un sous-processus, vous pouvez simplement la subprocess.wait()terminer, par exemple. Si votre tâche consiste à attendre qu'un fichier ou un répertoire du système de fichiers soit touché, vous pouvez utiliser pyinotify pour obtenir votre code déclenché à partir de l'événement du système de fichiers géré par le noyau.

Répondre

C'est ainsi que vous écrivez une boucle infinie pour une attente occupée sans consommer trop de CPU.

Python 2:

from __future__ import print_function
from __future__ import division

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

Python 3:

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

Évaluation

Comme @gnibbler l'a testé dans une autre réponse , le code présenté ne devrait pas consommer plus de 1% de CPU sur les machines récentes. S'il consomme toujours trop de CPU avec votre code de charge utile, pensez à augmenter encore le temps de sommeil. D'un autre côté, le code de charge utile devra peut-être être optimisé pour une exécution répétée. Par exemple, la mise en cache peut accélérer l'exécution sur des données inchangées.

Crédits

Cette réponse tente de s'appuyer sur la réponse de @ user2301728 .

Bengt
la source
3

J'ai eu le même problème, voir ma question sur Stack Exchange . La solution était une combinaison de time.sleep(0.01)et nice. niceréduit le processeur disponible pour une application. Voici comment je commence l'application: nice -n 19.

dotancohen
la source
1

Vous pouvez également essayer nice -n 19 python myscript.py.

nice est un utilitaire * nix pour définir la priorité CPU d'une tâche. 19 est le poids le plus important et par conséquent le réglage le plus lent.

CyberSkull
la source
2
Non. Augmenter la finesse d'un processus n'aide qu'en permettant à d'autres processus d'obtenir les CPU plus souvent. À tout moment où il n'y a pas d'autres processus, le code OP utilisera toujours 100% CPU et s'il y en a, ils utiliseront le CPU, totalisant à nouveau à 100%.
Bengt