Soru Python'da çoklu işlem mi yoksa iplik mi?


Bir veri koleksiyonunu toplayan bir python uygulamasına sahibim ve bu koleksiyondaki her veri parçası için bir görev gerçekleştirir. Görevde gecikme olduğu için tamamlanması biraz zaman alır. Bu gecikme nedeniyle, her veri parçasının görevi daha sonra gerçekleştirmesini istemiyorum, bunların hepsinin paralel olmasını istiyorum. Çok işlemcili mi kullanmalıyım? veya bu işlem için iş parçacığı mı?

İş parçacığı kullanmayı denedim ama bazı sıkıntıları vardı, genellikle bazı görevler asla ateş etmeyecekti.


32
2017-08-04 09:47


Menşei


"Veri toplama" ne kadar büyük? Çok büyükse, her biri için iş parçacığı veya süreçleri başlatmak istemeyebilirsiniz. - S.Lott
genellikle 1, 2 veya 3 adet veri. - Ryan
@ S.Lott - iş parçacığı / işlem sayısını veri boyutundan çok daha küçük bir sayı ile nasıl sınırlarsınız? - Adam Greenhall
@Adam Greenhall: Bu ilişkisiz bir soru; çoklu işlem havuzları bunun için. Bu soruyu hala anlamaya çalışıyorum. 10.000 veri parçası varsa, 10.000 eşzamanlı süreç (veya ileti dizisi) gerçekten kötü bir fikir gibi görünüyor. Eğer sadece 3 varsa, en basit çözüm en etkili olduğu için, sormaya değer görünmüyor. - S.Lott


Cevaplar:


Eğer gerçekten hesaplanıyorsanız çoklu işlem modülü Muhtemelen en hafif çözümdür (bellek tüketimi ve uygulama zorluğu açısından).

G / Ç bağlıysanız, diş modülü genellikle size iyi sonuçlar verecektir. İş parçacığınıza veri aktarmak için iş parçacığı güvenli depolama (Kuyruk gibi) kullandığınızdan emin olun. Veya onlara, kendilerine özgü olduklarında kendilerine özgü olan tek bir veri parçasını veriniz.

PyPy performansa odaklanır. Hesaplamaya bağlı işlemede yardımcı olabilecek bir dizi özellik vardır. Ayrıca, henüz üretim kalitesi olmasa da Yazılım İşlem Belleği desteği vardır. Buradaki vaat, çoklu işlemden (bazı garip gereksinimlere sahip olan) daha basit paralel veya eşzamanlı mekanizmalar kullanabilmenizdir.

Stackless Python ayrıca güzel bir fikir. Yığınsız yukarıda belirtilen taşınabilirlik sorunları var. Unladen Kırlangıç ümit vericiydi, ama şimdi defunct. PİSTON hıza odaklanan başka bir (bitmemiş) Python uygulamasıdır. Daha iyi (ya da sadece farklı) hızlanmalara yol açabilen PyPy'ye farklı bir yaklaşım benimsiyor.


30
2017-08-04 12:26





Görevler sıralı olarak çalışır, ancak paralel olarak çalıştırılan yanılsaması vardır. Dosya veya G / Ç bağlantısı için kullandığınız zaman ve hafif ağırlıklar olduğundan, görevler iyidir.

Havuzlu Multiprocess sizin için doğru çözüm olabilir çünkü süreçler paralel çalışır, bu yüzden her işlem bir CPU (veya çekirdek) içinde çalıştığı için yoğun hesaplama ile çok iyidir.

Kurulum çok işlemi çok kolay olabilir:

from multiprocessing import Pool

def worker(input_item):
    output = do_some_work()
    return output

pool = Pool() # it make one process for each CPU (or core) of your PC. Use "Pool(4)" to force to use 4 processes, for example.
list_of_results = pool.map(worker, input_list) # Launch all automatically

9
2018-01-26 03:13



Aynı veriler üzerinde çalışan tüm çekirdekler anlamına mı geliyor? input_list'i bölmek ve her bir parçayı farklı çekirdeklere geçirmek mümkün mü? - Moj


Küçük veri koleksiyonları için, sadece alt işlemlerle subprocess.Popen.

Her bir alt işlem, sadece stdin'den veya komut satırı argümanlarından gelen veri parçasını alabilir, işlem yapar ve sonucu bir çıktı dosyasına yazar.

Alt süreçler tamamlandığında (veya zaman aşımına uğradığında), çıktı dosyalarını birleştirirsiniz.

Çok basit.


7
2017-08-04 10:31



Bu gerçekten ağır bir çözümdür. Verileri harici bir sürece beslemek için düzenlemek zorunda kalmanın yanı sıra, büyük bir yükünüz var. - Christopher
@Christopher. Önemli olan nokta. Unix dünyası bu tekniği 40 yıldır kullanıyor. İyi çalışıyor çünkü basit. Ayrıca, aynı ikili görüntünün birden çok örneğini çalıştırdığınız için genel gider gerçekten "kitlesel" değil. Bu GNU / Linux tarafından iyi optimize edilmiştir. - S.Lott
@ S.Lott: Uzun zamandır kullanıldığından, bunun iyi bir çözüm olduğu anlamına gelmez. Özellikle bilgisayarlı problemler için iyi bir çözüm değildir. Ek yük "devasa" dır çünkü tüm işlem başına yapıların bellek yüküne ve çoklu çekirdek geçişlerinin gecikmesine sahip olursunuz. Python çoklu işlem modülü, alt süreç gibi yeni bir "süreç" yaratmaz. Yeni bir OS seviyesinde süreç yaratmaktan çok daha hafif olan yeni bir yorumlayıcı bağlamı yaratır. - Christopher
@ Cristopher: hepsi doğru. Alt işlemin kullanılması daha basittir. Tanımsız bir şekilde "daha iyi" değil. Daha hızlı olması olası değildir. Bazen, aslında daha hızlıdır çünkü genel giderler, işlem başlangıcı sırasında daha fazla etkiye sahiptir. Önemli olan nokta, birden fazla alt işlemin genellikle daha basit olmasıdır. - S.Lott


Bakmayı düşünebilirsiniz Stackless Python. Uzun süren fonksiyon üzerinde kontrolünüz varsa, sadece bazılarını atabilirsiniz. stackless.schedule()orada (bir sonraki koroutine verim), ya da önleyici çoklu görev için Stackless set.

Stackless'da iş parçacığınız yok, ancak Tasklets veya greenlets Bunlar aslında çok hafif ipliklerdir. Çoklu görevler almak için çok az kurulum ile oldukça iyi bir çerçeve var.

Bununla birlikte Stackless, taşınabilirliği birkaç Python kütüphanesinin yerini almanız gerektiğinden taşınabilirliği engeller - Stackless, C yığınına olan güveni ortadan kaldırır. Bir sonraki kullanıcının Stackless yüklü olması durumunda çok taşınabilir, ancak bu nadiren geçerli olacaktır.


7
2017-08-04 11:06





CPython'un iş parçacığı modelini kullanmak, herhangi bir performans artışı sağlamaz, çünkü çöp toplama işleminin gerçekleştirilmesi nedeniyle iş parçacıkları aslında paralel olarak yürütülmez. Çoklu işlem paralel yürütmeye izin verir. Açıkçası bu durumda, paralel işlerinizi çiftleştirmek için birden fazla çekirdeğe sahip olmanız gerekir.

Mevcut daha fazla bilgi var bu ilgili soru.


0
2017-08-04 10:10



Bu doğru değil. Size C veya C ++ olarak söyleyeceği gibi bir performans artışı vermeyecektir, ancak bazı eşzamanlılık gerçekleşir. Özellikle eğer G / Ç bağlı iseniz yardımcı olur. - Christopher
Bunu fark etmemiştim - bilgi için teşekkürler. İşte bir dış duyarlılık: mail.python.org/pipermail/python-dev/2008-May/079461.html. Bu kıyaslamada, tanımladığınız G / Ç ile ilişkili sorunların iyileşmesini görebilirsiniz. Ancak, CPU'yla ilişkili sorunun gerçekten çalıştığını belirtmek gerekir. daha yavaş 2 Python iş parçacığı ile 1'den daha! Uygulamanız için profil oluşturma önemlidir. - ire_and_curses


Sahip olduğunuz verileri kolayca bölümlere ayırıp ayırabiliyorsanız, bu bölümlemeyi harici olarak yapmanız ve bunları programınızın çeşitli işlemleriyle beslemeniz gerektiği gibi geliyor. (yani iplikler yerine birkaç süreç)


0
2017-08-04 13:45





IronPython, CPython’un ve GIL’in tersine, gerçek bir çoklu yayılıma sahiptir. Yani yaptığınız şeye bağlı olarak bakmaya değer olabilir. Fakat kullanım durumunuzun çoklu işlem modülüne daha uygun olduğu anlaşılıyor.

İstifsiz python'u öneren kişide, bu konuda uzman değilim, ama bana öyle geliyor ki, yazılım "multithreading" den bahsediyor, ki bu aslında hiç paralel değil (hala tek bir fiziksel dişte çalışıyor, yani Birden çok çekirdek.) Asenkron (ama yine de tek iş parçacıklı, paralel olmayan) uygulamayı yapılandırmanın alternatif bir yolu.


0
2017-08-10 01:31





Bakmak isteyebilirsiniz bükülmüş. Eşzamansız ağ görevleri için tasarlanmıştır.


0
2018-01-26 03:17