2016-04-13 36 views
0

Diğer projelerimden birine dağıtılmış bir hesaplama modeli geliştirmek için üzerinde çalıştığım bir projem var. Komut dosyalarından biri çok işlem görüyor, dizinlerdeki değişikliklerin izlenmesi, turşu kodlarının çözülmesi, onlar için yöneltilen düğümlere dayalı olarak kimlik doğrulama anahtarları oluşturması ve bunları yeniden işlemek. (Düzenleme: Bu işlemlerin tümü döngüler halinde çalışır.)(Unix/Python) Etkinlik Monitörü% CPU

Sorunun nedeni, OSX'teki etkinlik izleyicisine baktığımda,% CPU'm% 100'ünü komut dosyalarını çalıştıran birincil işlemler için görüntüler. % 100 gösteren bu üçü yönetici betiğidir ve iki düğüm (modeli bir makinede simüle ediyorum, niyet modeli gelecekte bir kümelenme ağına taşımaktır). Bu bir bozuk var mı? Sistem kullanımım% 27.50, kullanıcı% 12.50 ve% 65 boşta.

İlk önce kendimi araştırmaya teşebbüs ettim ve tek düşüncem şu: bu rakamlar işlemin tüm süre boyunca CPU'yu kullandığını ve hiçbir zaman boşta kalmadığını gösteriyor.

Biraz açıklama alabilir miyim? Benim süreçleri, kendi dizinleri dosyalara değişikliklerin izlenmesi, sonsuz bir döngü içinde çalışacak yönetici süreç/komut dosyasından yeni 'iş' (almak için: açıklamalara dayanarak

OSX Activity Monitor

Güncelleme Projenin nihai uygulamasında kümedeki ayrı bir bilgisayar). Belki bu formda çok fazla işlemci süresi gerektirmeyen G/Ç'yi beklemenin daha iyi bir yolu var mı?

+1

Sonuçlarınızı kabul ediyorum. Orada sonsuz döngü var mı? Eğer IO'yu izlerseniz ve zaman aşımınız 0 ise hemen zaman aşımına uğrayacak ve% 100 bilgi işlem python işiyle uğraşacaksınız (IO'yu beklemek yerine). – syntonym

+0

Yani bir ** _ kötü _ ** şey değil, o zaman? Evet, döngülerim sonsuz, yönetici ve düğümler sürekli ilgili dosyalar için belirli dizinleri kontrol ediyor. Ana projemdeki son uygulamada, yönetici çeşitli giriş biçimlerini (IMAP, STDIN, XMPP, Web, Ses vb.) Sürekli olarak izleyecek ve bu girdileri işlenecek kümedeki diğer düğümlere "iş" olarak dağıtacaktır. Böylece, gerçek paralel hesaplamayı kullanabiliyorum (yani bir düğümün bir "iş" CPU'sunu tek bir iş için kullanarak). Soruyu güncelleyeceğim. –

+0

Döngünün içine küçük bir uyku koymak, bu tür şeyler zaten G/Ç bağlı olduğu sürece, gecikme eklemeden CPU'yu muazzam bir şekilde geliştirecektir. – tripleee

cevap

0

Çözelti (Bununla birlikte, eğer optimumun): 0.1 saniye, her döngünün sonunda bir time.sleep(n) dönemi uygulanmaktadır. CPU zamanını% 0,4'ten fazlaya indirdi.

Yine de, Python Standard Kitaplığı'nda bulunmayan modülleri kullanmadan CPU zamanını azaltmanın daha uygun bir yolunu arıyorum, sistemin olmasını istediğiniz gibi bir time.sleep(n) periyodu kullanmaktan kaçınmak istiyorum. her an cevap verebilecek ve giriş dosyalarının yükü çok yükseldiğinde, dosyaların işlenebileceği zamanın uyumasını istemiyorum.

Benim süreçleri meşgul bekleyen tarafından yürüttüğümüzden, onları aşırı CPU zamanı kullanmasına sebep oldu:

while True: 
    files = os.path.listdir('./sub_directory/') 

    if files != []: 
     do_something() 

Bu benim yürütme ediyorum her komut/süreç için temel oluşturur.