¿Cómo puedo reducir el uso de CPU para este programa Python?


15

Haré que Python se ejecute 24/7 en un ciclo while, aquí hay un ejemplo del tipo de programa:

while True:

    print ("me again...")

Pero cuando lo ejecuto, ¡mi CPU llega al 100%! Pero no quiero eso, ya que mi programa se ejecutará durante largos períodos de tiempo, etc. y no quiero que mi CPU se caliente mucho , ¿hay alguna forma de evitar esto?


3
sin esperar, la CPU funciona al 100% porque eso es lo que le dijo que hiciera :) imprima lo más rápido posible. Así que esperar ayudará a descargar esa carga. imprimir, generalmente es una operación muy costosa. escribir en un archivo es mucho más barato.
Piotr Kula

Debe informar al sistema operativo que no desea ningún ciclo de CPU durante un período de tiempo determinado; de lo contrario, no puede hacer nada para evitar lo que ve.
Thorbjørn Ravn Andersen

Respuestas:


16

Al final de tu ciclo tienes un

time.sleep(xx)por segundos, o time.sleep(x.x)para representar segundos parciales

(Por favor, recuerde que debe importar el tiempo en la biblioteca, así: import time)

Con xx siendo lo más alto posible sin afectar negativamente a su programa. En este momento, su programa siempre está haciendo todo lo más rápido que puede, en lugar de darle tiempo para que el Pi descanse o haga otra cosa.


Hmmmm ... Muy interesante ... Lo intentaré. ¡Gracias! ¡No puedo creer que no haya pensado en eso!
user151324

¿Hay una biblioteca que debería importar, etc.? Estoy recibiendo un error que dice que el tiempo no está definido
user151324

@coding_corgi sí, necesitas la biblioteca de tiempos.
Butters

2
Entonces import time?
user151324

@coding_corgi. Si, eso es correcto.
Butters

14

Prefacio

Asegúrese de que realmente necesita ejecutar su tarea repetidamente. Esto se llama espera ocupada y casi siempre subóptima. Si su tarea está verificando la salida de un subproceso, puede simplemente subprocess.wait()terminarla, por ejemplo. Si su tarea es esperar a que se toque un archivo o directorio en el sistema de archivos, puede usar pyinotify para activar su código desde el evento del sistema de archivos manejado por el núcleo.

Responder

Así es como se escribe un bucle infinito para la espera ocupada sin consumir demasiada 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

Evaluación

Como @gnibbler probó en otra respuesta , el código presentado no debe consumir más del 1% de CPU en máquinas recientes. Si todavía consume demasiada CPU con su código de carga útil, considere aumentar el tiempo para dormir aún más. Por otro lado, es posible que el código de carga útil deba optimizarse para la ejecución repetida. Por ejemplo, el almacenamiento en caché podría acelerar la ejecución de datos sin cambios.

Créditos

Esta respuesta intenta basarse en la respuesta de @ user2301728 .


3

Tuve el mismo problema, vea mi pregunta en Stack Exchange . La solución fue una combinación de time.sleep(0.01)y nice. nicereduce la CPU disponible para una aplicación. Esta es la forma de empezar la aplicación: nice -n 19.


1

También podrías intentarlo nice -n 19 python myscript.py.

nice es una utilidad * nix para establecer la prioridad de CPU de una tarea. 19 es el peso más grande y, en consecuencia, el ajuste más lento.


2
No. Aumentar la simplicidad de un proceso solo ayuda al permitir que otros procesos obtengan las CPU con más frecuencia. En cualquier momento en que no haya otros procesos, el código de OP seguirá utilizando el 100% de la CPU y, si lo hay, utilizará la CPU, totalizando nuevamente al 100%.
Bengt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.