Bu Python programı için CPU kullanımını nasıl azaltabilirim?


15

Bir süre döngüde 24/7 çalıştırmak bir Python sahip olacak, işte program tür bir örnek:

while True:

    print ("me again...")

Ama çalıştırdığımda, CPU'm% 100'e çıkıyor! Ama bunu istemiyorum, çünkü programım uzun süre çalışacak, vb. Ve CPU'mun çok ısınmasını istemiyorum , yine de bunu önleyebilir miyim?


3
Beklemeden CPU% 100 gidiyor çünkü bunu söyledin :) olabildiğince hızlı yazdır. Bu yüzden bekleyin, bu yükü boşaltmaya yardımcı olacaktır. baskı, genellikle çok pahalı bir işlemdir. bir dosyaya yazmak çok daha ucuzdur.
Piotr Kula

İşletim sistemine belirli bir süre için herhangi bir işlemci döngüsü istemediğinizi söylemeniz gerekir, aksi takdirde gördüğünüz şeylerden kaçınmak için hiçbir şey yapamazsınız.
Thorbjørn Ravn Andersen

Yanıtlar:


16

Döngünüzün sonunda bir

time.sleep(xx)saniye veya time.sleep(x.x)kısmi saniye

(Şöyle kütüphane zaman içe unutmayın lütfen: import time)

Programınızı olumsuz etkilemeden xx'in mümkün olduğunca yüksek olması. Şu anda programınız Pi'nin dinlenmesi veya başka bir şey yapması için biraz zaman vermek yerine her zaman olabildiğince hızlı çalışıyor.


Hmmmm ... Çok ilginç ... Deneyeceğim. Teşekkürler! Bunu düşünmediğime inanamıyorum!
user151324

İçe aktarmam gereken bir kütüphane var mı? Zamanın tanımlanmadığını söyleyen bir hata alıyorum
user151324

@coding_corgi evet, zaman kütüphanesine ihtiyacınız var.
Butters

2
Yani import time?
user151324

@coding_corgi. Evet doğru.
Butters

14

önsöz

Görevinizi tekrar tekrar çalıştırmanız gerektiğinden emin olun. Buna meşgul bekleme ve neredeyse her zaman yetersiz denir . Göreviniz bir alt işlemin çıktısını kontrol ediyorsa, subprocess.wait()örneğin bunun tamamlanmasını sağlayabilirsiniz . Göreviniz dosya sistemindeki bir dosyaya veya dizine dokunulmasını beklemekse , kodunuzun çekirdek tarafından işlenen dosya sistemi olayından tetiklenmesi için pyinotify'ı kullanabilirsiniz .

Cevap

Çok fazla CPU tüketmeden meşgul beklemek için sonsuz döngüyü bu şekilde yazarsınız.

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

Değerlendirme

@Gnibbler başka bir yanıtta test edildiğinden , sunulan kod son makinelerde% 1'den fazla CPU tüketmemelidir. Yük kodunuzla hala çok fazla CPU tüketiyorsa, daha fazla uyku zamanını artırmayı düşünün. Öte yandan, yük kodunun tekrarlı yürütme için optimize edilmesi gerekebilir. Örneğin, Önbellekleme değişmemiş verilerde çalışmayı hızlandırabilir.

Kredi

Bu yanıt @ user2301728 yanıtını temel almaya çalışır .


3

Aynı sorunu yaşadım , Stack Exchange ile ilgili soruma bakın . Çözelti bir kombinasyonu olduğu time.sleep(0.01)ve nice. nicebir uygulamanın kullanabileceği CPU'yu düşürür. Bu benim Uygulamayı başlatmak nasıl: nice -n 19.


1

Ayrıca deneyebilirsiniz nice -n 19 python myscript.py.

nice bir görevin CPU önceliğini ayarlamak için bir * nix yardımcı programıdır. 19 en büyük ağırlık ve dolayısıyla en yavaş ayardır.


2
Hayır. Bir işlemin güzelliğini artırmak, yalnızca diğer işlemlerin CPU'ları daha sık almasını sağlayarak yardımcı olur. Başka bir işlem olmadığı herhangi bir anda, OP'nin kodu hala% 100 CPU kullanacak ve eğer varsa, tekrar% 100 oranında CPU kullanacaklardır.
Bengt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.