Jak mogę zmniejszyć użycie procesora dla tego programu w języku Python?


15

Będę miał Python działający 24/7 w pętli while, oto przykład tego rodzaju programu:

while True:

    print ("me again...")

Ale kiedy go uruchamiam, mój procesor przechodzi w 100%! Ale nie chcę tego, ponieważ mój program będzie działał przez długi czas itp. I nie chcę, aby mój procesor był bardzo gorący, czy w każdym razie mogę temu zapobiec?


3
bez czekania procesor idzie w 100%, bo tak właśnie kazałeś :) drukuj tak szybko, jak to możliwe. Więc czekanie pomoże odciążyć to obciążenie. druk, ogólnie jest bardzo kosztowną operacją. zapis do pliku jest znacznie tańszy.
Piotr Kula,

Musisz powiedzieć systemowi operacyjnemu, że nie chcesz żadnych cykli procesora przez określony czas, w przeciwnym razie nie możesz nic zrobić, aby uniknąć tego, co widzisz.
Thorbjørn Ravn Andersen

Odpowiedzi:


16

Na końcu pętli masz

time.sleep(xx) przez kilka sekund lub time.sleep(x.x) do reprezentowania częściowych sekund

(Pamiętaj, aby zaimportować czas z biblioteki, w ten sposób: import time )

Ponieważ xx jest tak wysoki, jak to możliwe, bez negatywnego wpływu na twój program. W tej chwili twój program zawsze robi wszystko tak szybko, jak to możliwe, zamiast dać czas Pi na odpoczynek lub zrobienie czegoś innego.


Hmmmm ... Bardzo interesujące ... Spróbuję tego. Dzięki! Nie mogę uwierzyć, że o tym nie pomyślałem!
user151324

Czy jest biblioteka, którą powinienem zaimportować itp.?
Pojawia

@coding_corgi tak, potrzebujesz biblioteki czasu.
Butters

2
Tak import time?
user151324

@coding_corgi. Tak to jest poprawne.
Butters

14

Przedmowa

Upewnij się, że naprawdę musisz wielokrotnie uruchamiać swoje zadanie. Nazywa się to zajęciem oczekiwania i prawie zawsze nieoptymalnym. Jeśli Twoim zadaniem jest sprawdzenie wyników podprocesu, możesz subprocess.wait()na przykład po prostu zakończyć. Jeśli Twoim zadaniem jest poczekanie na dotknięcie pliku lub katalogu w systemie plików, możesz użyć pyinotify aby uruchomić kod ze zdarzenia systemu plików obsługiwanego przez jądro.

Odpowiedź

W ten sposób piszesz nieskończoną pętlę dla zajętego oczekiwania bez zużywania zbyt dużego procesora.

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

Ocena

Jak przetestowano @gnibbler w innej odpowiedzi , prezentowany kod nie powinien zużywać więcej niż 1% procesora na najnowszych komputerach. Jeśli nadal zużywa zbyt dużo procesora z kodem ładunku, rozważ wydłużenie czasu spania jeszcze bardziej. Z drugiej strony kod ładunku może wymagać optymalizacji w celu powtórnego wykonania. Na przykład buforowanie może przyspieszyć działanie na niezmienionych danych.

Kredyty

Ta odpowiedź opiera się na odpowiedzi @ user2301728 .



1

Możesz także spróbować nice -n 19 python myscript.py.

nice to narzędzie * nix do ustawiania priorytetu CPU zadania. 19 jest największą wagą, a zatem najwolniejszym ustawieniem.


2
Nie. Podnoszenie łagodności procesu pomaga tylko poprzez umożliwienie innym procesom częstszego uzyskiwania procesorów. W dowolnym momencie, gdy nie ma innych procesów, kod OP nadal będzie wykorzystywać 100% procesora, a jeśli tak, będą używać procesora, co łącznie będzie miało wartość 100%.
Bengt,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.