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?


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.


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 .



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.


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,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.