2016-04-06 9 views
-1

Parelle'de iki temel yoğun işlevin nasıl çalıştırılacağını anlamak isterim. Fonksiyonlar aynı girişi gerektirir ve farklı çıkışlar üretir.Paralel olarak farklı yöntemler nasıl çalıştırılır ve daha fazla işlem için çıktılar nasıl elde edilir?

Son kez çok işlemcili kitaplığı kullandım, sonuçları bir dosyaya kaydettim ve daha fazla işleme gerek duymadım.

Aşağıda, kod türünün basit bir örneği verilmiştir. Fonksiyonlar nasıl paralelleştirilir, böylece hem a ve b çıkışları daha fazla işlem için kullanılabilir? Python 2.7 kullanıyorum.

input_dict = {'key1':'value1','key2':'value2','key3':'value3'} 

def func1(dictionary): 
    # do some work 
    return np.array() 

def func2(dictionary): 
    # do different work 
    return np.array() 

a = func1(input_dict) 
b = func2(input_dict) 

result = np.dot(a, b) 

Her iki işlevi birlikte çalıştırmak ve çıktılarını toplamak için kodun doğru yolun altında mı?

from multiprocessing import Process, Queue 

input_dict = {'key1':'value1','key2':'value2','key3':'value3'} 

def func1(dictionary): 
    # do some work 
    return q.put(np.array()) 

def func2(dictionary): 
    # do different work 
    return q.put(np.array()) 


if __name__ == '__main__': 
    q1 = Queue() 
    q2 = Queue() 
    p1 = Process(target=func1, args=(input_dict,)) 
    p2 = Process(target=func2, args=(input_dict,)) 
    p1.start() 
    p2.start() 

    a = q1.get() 
    b = q2.get() 
    p1.join() 
    p2.join() 
    result = np.dot(a, b) 
+1

bir dosya okuma parçacığı tarafından beslenen bir kuyruğu kullanın. –

+0

2 kuyrukları kullanarak? İki çıkışı ayrı tutmak ve np.dot() kullanarak bunları birlikte işlemek istiyorum. Bir örnek verebilir misiniz? Iv'e dokümanlar okudu ve daha önce çok işlemcili kütüphaneyi kullandı ancak bu kullanım konusunda kafam karıştı. – Greg

+0

Tamam, belki sorunuzu daha iyi ifade etmelisiniz. İlk paragrafınız "İşlevler aynı girişi gerektirir ve farklı çıktılar üretir" der. Ayrıca, ben 2 kuyruk demedim - ** bir ** sıra dedim. Bu haliyle, kodunuzu paralellik etmek için hiçbir çaba göstermediniz. Neden daha fazla ilerlemiyorsunuz ve sonra daha spesifik bir soru sormuyorsunuz? –

cevap

0

Çoğunlukla doğru, ama süreçlerin başlatırken q1 ve q2 geçmek zorunda. a = q1.get() gibi sonuçlar kuyruğu sadece kuyrukta değil, bir liste tek bir öğe elde ettiğinizi unutmayın alırken

Ayrıca q.put(np.array())

ile return q.put(np.array()) değiştirin. Eğer bir listesini çıkarmak gerekiyorsa

, böyle bir şey yapabilirsiniz:

from multiprocessing import Process, Queue 
import numpy as np 

input_dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} 


def func1(dictionary, q): 
    # do some work 
    for x in xrange(5): 
     q.put(
      np.random.randint(2, size=20) 
     ) 
    q.put('STOP') 


def func2(dictionary, q): 
    # do different work 
    q.put(
     np.array([1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 
        1, 0, 1, 0, 1, 0, 0, 1, 1, 1]) 
    ) 


if __name__ == '__main__': 
    q1 = Queue() 
    q2 = Queue() 
    p1 = Process(target=func1, args=(input_dict, q1)) 
    p2 = Process(target=func2, args=(input_dict, q2)) 
    p1.start() 
    p2.start() 

    f1_results = [] 
    # Keep adding items from func1 to the results list, until it sees a 'STOP' item 
    for array in iter(q1.get, 'STOP'): 
     f1_results.append(array) 

    b = q2.get() 
    p1.join() 
    p2.join() 

    for a in f1_results: 
     result = np.dot(a, b) 
     print result