Como posso diminuir o uso da CPU para este programa Python?

15

Eu vou ter um Python executado 24/7 em um loop while, aqui está um exemplo do tipo de programa:

while True:

    print ("me again...")

Mas quando eu o executo, minha CPU chega a 100%! Mas não quero isso, já que meu programa será executado por longos períodos de tempo etc. e não quero que minha CPU fique muito quente. Existe alguma maneira de impedir isso?

user151324
fonte
3
sem esperar, a CPU aumenta 100%, porque foi isso que você pediu :) imprima o mais rápido possível. Portanto, a espera ajudará a descarregar esse fardo. impressão, geralmente é uma operação muito cara. gravar em um arquivo é muito mais barato.
Piotr Kula
Você precisa informar ao sistema operacional que não deseja ciclos de CPU durante um determinado período de tempo, caso contrário, não poderá fazer nada para evitar o que vê.
Thorbjørn Ravn Andersen

Respostas:

16

No final do seu loop, tenha um

time.sleep(xx)por segundos ou time.sleep(x.x)para representar segundos parciais

(Por favor, lembre-se de importar a biblioteca de tempo, assim: import time)

Com xx sendo o mais alto possível, sem afetar adversamente o seu programa. No momento, seu programa está sempre fazendo tudo o mais rápido possível, em vez de dar algum tempo para o Pi descansar ou fazer outra coisa.

Manteigas
fonte
Hmmmm ... Muito interessante ... Vou tentar. Obrigado! Não posso acreditar que não pensei nisso!
user151324
Existe uma biblioteca que devo importar etc.? Estou recebendo um erro dizendo que o tempo não é definido
user151324
@coding_corgi sim, você precisa da biblioteca de tempo.
Butters
2
Então import time?
user151324
@coding_corgi. Sim, está correto.
Butters
14

Prefácio

Certifique-se de que realmente precisa executar sua tarefa repetidamente. Isso é chamado de espera ocupada e quase sempre abaixo do ideal. Se sua tarefa estiver verificando a saída de um subprocesso, você poderá subprocess.wait()concluir, por exemplo. Se sua tarefa é esperar que um arquivo ou diretório no sistema de arquivos seja tocado, você pode usar o pyinotify para obter seu código acionado a partir do evento do sistema de arquivos tratado pelo kernel.

Responda

É assim que você escreve loop infinito para espera ocupada sem consumir muita 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

Avaliação

Como o @gnibbler testou em outra resposta , o código apresentado não deve consumir mais de 1% da CPU em máquinas recentes. Se ele ainda consome muita CPU com seu código de carga, considere aumentar o tempo para dormir ainda mais. Por outro lado, o código da carga útil pode precisar ser otimizado para execução repetida. Por exemplo, o armazenamento em cache pode acelerar a execução de dados inalterados.

Créditos

Esta resposta tenta se basear na resposta de @ user2301728 .

Bengt
fonte
3

Eu tive o mesmo problema, veja minha pergunta no Stack Exchange . A solução foi uma combinação de time.sleep(0.01)e nice. nicereduz a CPU disponível para um aplicativo. É assim que eu iniciar o app: nice -n 19.

dotancohen
fonte
1

Você também pode tentar nice -n 19 python myscript.py.

nice é um utilitário * nix para definir a prioridade da CPU de uma tarefa. 19 é o maior peso e, consequentemente, a configuração mais lenta.

CyberSkull
fonte
2
Não. Aumentar a gentileza de um processo apenas ajuda ao permitir que outros processos obtenham as CPUs com mais frequência. A qualquer momento que não haja outros processos, o código do OP ainda utilizará 100% da CPU e, se houver, eles usarão a CPU, totalizando novamente em 100%.
Bengt,