Python'da çoklu işlemde hata ayıklama


Yanıtlar:


6

Gerçek çok işlemli Python programları ( korkunç GIL ile uğraşmak zorunda olan çok iş parçacıklı Python programlarının aksine ) diğer dillerdekinden farklı değildir. Hepsi aynı temel zorluklara sahiptir:

  1. Görev ataması ve sonuç raporlaması. Çoğunlukla bağımsız veri kümeleri üzerinde çalışıyor olsalar da, normalde sonuçları raporlamak ve üzerinde çalışmak için yeni veriler elde etmek için ana iş parçacığına geri dönmeleri gerekir . Bu bir boğulma noktası olabilir.
  2. Yarış koşulları. İşlemler her seferinde bir kaynak kullanmaya çalışıyor ve birbirlerinin verilerinin üzerine basmaktan kaçınmak için muteks (veya benzer bir şey) kullanmaları gerekiyor. Bu tür kaynakların korunmaması, gerçekten, gerçekten acı veren hata ayıklama oturumlarına yol açabilir .
  3. Sıralı. Bazen paralel olmayan bir şey yapmaya çalışıyorsunuz. Çeşitli süreçler birbirinin bir şey yapmasını bekler ve sonuç olarak, tüm niyetler ve amaçlar için sıralı bir program aldınız, paralel hale getirdiniz ve yine de doğrusal zamanda (veya daha kötüsü) yürütülüyor.

Bu sorunların her birini önlemeye çalışan geliştirme yöntemleri olmasına rağmen, günün sonunda gerçekten ne yaptığınızı düşünmeniz gerekir. Ağır stres testlerini öneririm - gerçek hayatta olabileceğini düşündüğünüz her şeyin çok ötesinde - bu Fırsat Pencerelerini vurmak ve büyük bir demonun ortasında veya üretim sırasında aksine gelişimde patlamak için iyi bir şansınız var.

Biz mikrosaniye-timestamped günlük dosyalarını kullanmak için kullanılan ve biz böylece daha sonra renk kodlu günlük görüntüleme uygulaması oluşturulan denemek M işlemciler üzerinde çalışan N süreci arasında neler olduğunu görselleştirmek için. Ayrıca, kilitlenme bağlamını yeniden oluşturmak için günlük dosyalarını kapatacak bir sistem oluşturmayı denedik (ve çoğunlukla başarılı olduk).

Ancak en iyi araç, iyi tasarım ve uygulamanızı sudan çıkarmaya çalışan gerçekten kötü, kötü insanlar. (Selam, halter!)


26

Çok yararlı bulduğum bir şey, multiprocessingmodülde mevcut kaydediciyi kullanmak . Bunu ana kodunuzda deneyin:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

Ayrıca bkz: http://docs.python.org/library/multiprocessing.html#logging

Ayrıca, geçerli işlem adına aşağıdakileri kullanarak erişebilirsiniz:

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

Bkz. Http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process

Bunun dışında pdb& co gibi standart hata ayıklama yöntemleri dışında başka bir şey bilmiyorum .

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.