Як я можу зменшити використання процесора для цієї програми Python?


15

У мене буде цикл запуску Python 24/7, а ось приклад програми:

while True:

    print ("me again...")

Але коли я запускаю його, мій процесор переходить на 100%! Але я не хочу цього, оскільки моя програма працюватиме протягом тривалого часу, і т. Д., І я не хочу, щоб мій процесор дуже нагрівався, чи все-таки я можу це запобігти?


3
не чекаючи, процесор вийде на 100%, тому що це ви сказали йому робити: друкувати так швидко, наскільки це можливо. Тож чекати допоможе розвантажити цей тягар. друк, як правило, дуже дорога операція. запис у файл набагато дешевше.
Пьотр Кула

Вам потрібно сказати операційній системі, що ви не хочете ніяких циклів процесора протягом певного періоду часу, інакше ви нічого не можете зробити, щоб уникнути побаченого.
Thorbjørn Ravn Andersen

Відповіді:


16

В кінці петлі є а

time.sleep(xx)на секунди, або time.sleep(x.x)представляти часткові секунди

(Будь ласка , не забудьте імпортувати бібліотеку часу, наприклад , так: import time)

З можливістю xx бути максимально можливою без негативного впливу на вашу програму. Зараз ваша програма завжди робить все так швидко, як тільки може, а не давати пі пі трохи часу відпочити чи зробити щось інше.


Хм-м-м ... Дуже цікаво ... Спробую. Спасибі! Не можу повірити, я про це не думав!
користувач151324

Чи є бібліотека, яку я повинен імпортувати тощо? Я отримую помилку, кажучи, що час не визначено
user151324

@coding_corgi так, потрібна бібліотека часу.
Масло

2
Так import time?
користувач151324

@coding_corgi. Так, це правильно.
Масло

14

Передмова

Будьте впевнені, що вам справді потрібно повторно виконувати завдання. Це називається зайнятим очікуванням і майже завжди неоптимальним. Якщо ваше завдання перевіряє вихід підпроцесу, ви можете просто subprocess.wait()виконати його, наприклад. Якщо ваше завдання - дочекатися торкання файлу або каталогу у файловій системі, ви можете використовувати pyinotify, щоб отримати ваш код, ініційований у події файлової системи, якою керує ядро.

Відповідь

Так ви пишете нескінченний цикл для зайнятого очікування, не витрачаючи занадто багато процесора.

Пітон 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

Пітон 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

Оцінка

Як перевірено @gnibbler в іншій відповіді , представлений код не повинен споживати більше 1% процесора на останніх машинах. Якщо він все ще споживає занадто багато процесора з вашим кодом корисного навантаження, подумайте про те, щоб ще більше посилити час на сон. З іншого боку, код корисної навантаження може потребувати оптимізації для повторного виконання. Наприклад, кешування може пришвидшити роботу над незмінними даними.

Кредити

Ця відповідь намагається опиратися на відповідь @ user2301728 .



1

Ви також можете спробувати nice -n 19 python myscript.py.

nice - це утиліта * nix для встановлення пріоритету CPU завдання. 19 - найбільша вага і, отже, найповільніша установка.


2
Ні. Підвищення приємності процесу допомагає лише завдяки можливості іншим процесам частіше отримувати процесори. У будь-який момент, коли інших процесів немає, код OP все одно використовуватиме 100% процесор, і якщо вони є, вони будуть використовувати ЦП, знову на 100%.
Бенгт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.