2016-03-11 13 views
6

Dolayısıyla, Python'daki Çok İşlemcili modülünü kullanarak bir rutini hızlandırmaya çalışıyorum.Python'da Çok İşlemden nasıl çıktı alabilirim?

if __name__ == '__main__': 
    for i in range(0,2): 
     p = multiprocessing.Process(target=CSVReader.csvreader, args=(string_array[i],)) 
     p.start() 

şey şudur: Sonra

def csvreader(string): 

    from numpy import genfromtxt; 

    time,signal=np.genfromtxt(string, delimiter=',',unpack="true") 
    return time,signal 

Ben söyleyerek bu işlevi çağırmak

: Ben bunun için var, birkaç çekirdek arasında işi bölerek birkaç .csv dosyalarını okuyabilecek olmak istiyorum Bu herhangi bir çıktı kaydetmiyor. Çevrimiçi olarak tüm forumları okudum ve multiprocessing.queue ile bir yol olabileceğini gördüm ama bunu çok iyi anlamıyorum. Basit ve anlaşılır bir yöntem var mı?

+0

sen [belgelere giriş] baktınız mı (https://docs.python.org/2/library/multiprocessing.html#introduction)? –

+0

Gerçekten de sahibim. Beni yoğun olarak arayın ama programımı bu bilgi ile düzeltemedim. – Guillermo

cevap

2

En iyi seçiminiz, bu sorun için tam olarak tasarlanmış olan multiprocessing.Queue veya multiprocessing.Pipe'dur. İşlemler arasında veriyi güvenli ve kolay bir şekilde göndermenizi sağlar.

csvreader işlevinizin çıktısını döndürmek isterseniz, başka bir argüman iletmeniz gerekir; bu, verilerin ana işleme geri gönderileceği multiprocessing.Queue. Değerleri return yerine, sıraya yerleştirin ve ana işlem daha sonra bir noktada bunları alır. süreç onlar

İşleviniz şimdi şu şekilde görünecektir mevcuttur kadar sadece (bekleme) engeller varsayılan olarak, onları almak için çalıştığında onlar hazır değilseniz:

def cvsreader(string, q): 
    q.put(np.genfromtxt(string, delimiter=',', unpack="true")) 

ana rutin olur be: sahip

if __name__ == '__main__' 
    q = multiprocessing.Queue() 
    for i in range(2): 
     p = multiprocessing.Process(target=csvreader, args=(string_array[i], q,)) 
     p.start() 

# Do anything else you need in here 

time=np.empty(2,dtype='object') 
signal=np.empty(2,dtype='object') 
for i in range(2): 
    time[i], signal[i] = q.get() # Returns output or blocks until ready 
    # Process my output 

Not için iade etmek istediğiniz her öğeyi Queue.get() aramak için.

Daha fazla örnek ve bilgi için multiprocessing module belgesine bakın. the introduction to the documentation örnekten

+0

Orada eksik bir şey olmalı, çünkü her koştuğumda, sıkışıyor – Guillermo

+0

Haklısınız, benim düzenlemeye bakın. İşlemin 'start()' yöntemini çağırmalısınız. – bnaecker

+0

Aslında şimdi bir infinte döngüsünde takılıyor çünkü kuyruktaki öğeler tüketilmiyor, herhangi bir öneri var mı? – Guillermo

0

:

if __name__ == '__main__': 
    pool = Pool(2) 
    results = pool.map(CSVReader.csvreader, string_array[:2]) 
    print(results) 
İlgili konular