Come posso ridurre l'utilizzo della CPU per questo programma Python?


15

Avrò un Python eseguito 24/7 in un ciclo while, ecco un esempio del tipo di programma:

while True:

    print ("me again...")

Ma quando lo eseguo, la mia CPU arriva al 100%! Ma io non voglio che dal mio programma verrà eseguito per lunghi periodi di tempo, ecc e non voglio che la mia CPU sempre molto caldo, c'è qualche cosa che posso evitare questo?


3
senza aspettare la CPU va al 100% perché è quello che gli hai detto di fare :) stampa il più velocemente possibile. Quindi aspettare aiuterà a scaricare tale onere. stampa, generalmente è un'operazione molto costosa. scrivere su un file è molto più economico.
Piotr Kula,

Devi dire al sistema operativo che non vuoi alcun ciclo di CPU per un determinato periodo di tempo, altrimenti non puoi fare nulla per evitare ciò che vedi.
Thorbjørn Ravn Andersen,

Risposte:


16

Alla fine del ciclo avere a

time.sleep(xx)per secondi o time.sleep(x.x)per rappresentare secondi parziali

(Ricorda di importare l'ora della libreria, in questo modo import time:)

Con xx il più alto possibile senza influire negativamente sul programma. In questo momento il tuo programma fa sempre tutto il più velocemente possibile, piuttosto che concedere un po 'di tempo affinché il Pi si riposi o faccia qualcos'altro.


Hmmmm ... Molto interessante ... Lo proverò. Grazie! Non posso credere che non ci abbia pensato!
user151324

Esiste una libreria da importare, ecc.? Ricevo un errore che dice che l'ora non è definita
user151324

@coding_corgi sì, hai bisogno della libreria temporale.
Butters il

2
Quindi import time?
user151324

@coding_corgi. Si, è corretto.
Butters il

14

Prefazione

Assicurati di aver davvero bisogno di eseguire l'attività più volte. Questo si chiama attesa occupata e quasi sempre non ottimale. Se l'attività sta verificando l'output di un sottoprocesso, ad esempio è possibile solo subprocess.wait()che termini. Se il tuo compito è di attendere che un file o una directory nel filesystem vengano toccati, puoi usare pyinotify per ottenere il tuo codice attivato dall'evento del filesystem gestito dal kernel.

Risposta

Ecco come si scrive un ciclo infinito per l'attesa occupata senza consumare troppa 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

Valutazione

Come testato da @gnibbler in un'altra risposta , il codice presentato non dovrebbe consumare più dell'1% di CPU su macchine recenti. Se consuma ancora troppa CPU con il tuo codice payload, considera di aumentare ulteriormente il tempo di sospensione. D'altra parte, potrebbe essere necessario ottimizzare il codice del payload per l'esecuzione ripetuta. Ad esempio, la memorizzazione nella cache potrebbe accelerare l'esecuzione su dati invariati.

Titoli di coda

Questa risposta cerca di basarsi sulla risposta di @ user2301728 .


3

Ho avuto lo stesso problema, vedi la mia domanda su Stack Exchange . La soluzione era una combinazione di time.sleep(0.01)e nice. niceabbassa la CPU disponibile per un'applicazione. Questo è il modo di iniziare l'applicazione: nice -n 19.


1

Potresti anche provare nice -n 19 python myscript.py .

nice è un'utilità * nix per impostare la priorità della CPU di un'attività. 19 è il peso maggiore e, di conseguenza, l'impostazione più lenta.


2
No. Aumentare la semplicità di un processo aiuta solo consentendo ad altri processi di ottenere le CPU più spesso. In qualsiasi momento in cui non vi sono altri processi, il codice OP utilizzerà comunque la CPU al 100% e, in tal caso, utilizzerà la CPU, per un totale di nuovo al 100%.
Bengt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.