Як я можу зменшити використання процесора для цієї програми 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.