2010-04-23 17 views
32

Multiprocessing Bomba:Ben çoklu işlem üzerinde <a href="http://www.doughellmann.com/PyMOTW/multiprocessing/basics.html" rel="noreferrer">Doug Hellmann</a> öğreticisindeki aşağıdaki örneği çalışıyordu

import multiprocessing 

def worker(): 
    """worker function""" 
    print 'Worker' 
    return 

if __name__ == '__main__': 
    jobs = [] 
    for i in range(5): 
     p = multiprocessing.Process(target=worker) 
     jobs.append(p) 
     p.start() 

Ben eğer deyimi dışında çalıştırmak çalıştığımızda: Non-stop yumurtlama sürecini başlatan

import multiprocessing 

def worker(): 
    """worker function""" 
    print 'Worker' 
    return 

jobs = [] 
for i in range(5): 
    p = multiprocessing.Process(target=worker) 
    jobs.append(p) 
    p.start() 

, ve bunu durdurmanın tek yolu yeniden başlatıldı!

Peki bu neden oldu? Neden 5 süreç üretmedi ve çıkmadı? Neden ifadesine ihtiyacım var?

cevap

43

Windows'ta fork() rutini yoktur, bu nedenle multiprocessing işlevi worker işlevine erişmek için geçerli modülü içe aktarır. if bildirimi olmadan, alt işlem kendi çocuklarını başlatır vb. Belgelere pencerelerin (here) üzerine if ifadeye ihtiyacım bahseder

+1

, aynı başladıktan sonra) –

+0

Bunu nasıl keser misin? Sürecin görev yöneticisinde öldürülmesi onu etkilemiyor gibi görünüyor. –

+1

POSIX sistemlerinde sınırlar ve killall var, ancak Windows için çözüm bilmiyorum. –

3

Ben yaklaşık multiprocessing bilmiyorum, ama küresel farklı __name__ sahip çocuk süreçlerini çoğaltılır şüpheleniyoruz. Testi kaldırarak, her çocuğun yeniden yumurtlama sürecini başlatmasını sağlıyorsunuz.

6

Not.

Ancak belgeler bu yeniden başlatıyor, neredeyse anında makinenizi öldürür demiyor. Yani bu özellikle kafa karıştırıcı olabilir, özellikle multiprocessing'un kullanımı kodun derinlerinde bir işlev görürse. Ne kadar derinden saklanmış olursa olsun, ana program dosyasında hala if kontrolüne ihtiyacınız var. Bu hemen hemen tüm kitaplıklarda multiprocessing kullanarak kurallar. Genel olarak

multiprocessing biraz kaba görünüyor. Konu arayüzünün arayüzüne sahip olabilir, ancak GIL'nin etrafında basit bir yol yoktur.

daha karmaşık parallelleştirme sorunlar için ben de subprocess modül veya başka kütüphanelerin (gibi mpi4py veya Parallel Python) bakardım.

O bana 2 yeniden başlatma mal olması sonrasında, şimdi bilmek ilginç
+0

Alt işlem paketindeki herhangi bir iyi eğitim var mı? –

+0

Üzgünüm, gerçekten basit olanları bulamadım (örneğin bir PyMOTW makalesi var). Temel olarak, çalışan komut dosyanızı çalıştıran Python süreçleri yaratırsınız. Bu işlemlerin stdin/stdout'u kullanılarak veri gönderebilir/alabilirsiniz (örneğin, nesneleri turşu formunda gönderme). – nikow

+0

Çok işlemcinin kullanımları olduğunu ve sorununuzu çözmek için kullanabiliyorsanız hala en basit seçenek olduğunu unutmayın. Fakat eğer sizin için işe yaramıyorsa alt-süreç kullanmak o kadar fazla iş değildir (belki de yüz satır kod) ve size daha fazla seçenek sunar. – nikow

İlgili konular