2011-08-25 20 views
11

Python'da çoklu işlemeyi anlamaya çalışıyorum. Örneğin, "sonuç" olarak adlandırılan bir değişken varsa, bu kod bloğunda, örneğin, bu kod bloğunda, örneğin "sonuç" olarak adlandırılan bir değişken varsa. Çarpma işlevinin dönüş değerini "sonuç" a nasıl atayabiliriz?İşlevin dönüş değerini, çok işlemli bir değişkene atama mı? Ve IDLE ile ilgili bir sorun mu var?

Ve IDLE hakkında küçük bir sorun: Bu örneği Python Shell ile çalıştırmaya çalıştığımda, düzgün çalışmıyor mu?

20 
ok. 

Ama IDLE bu çalıştırmayı denerseniz: i .py dosyayı çift tıklarsanız, çıkış böyledir ...

ok. 

teşekkür

+0

BOŞTA bölümü ayrı olan sorusu (ve büyük olasılıkla, kodun yeniden yazılması için IDLE yapması gereken/muhtemelen yapmak zorunda olan kod çözme işleminin neden olduğu). – delnan

cevap

13

Tamam, ben bir şekilde yönetilen bu. Python belgelerine baktım ve şunu öğrendim: Queue sınıfını kullanarak, bir fonksiyondan getiri değerleri alabiliriz. Ve benim kod son hali şu şekildedir:

from multiprocessing import Process, Queue 

def multiply(a,b,que): #add a argument to function for assigning a queue 
    que.put(a*b) #we're putting return value into queue 

if __name__ == '__main__': 
    queue1 = Queue() #create a queue object 
    p = Process(target= multiply, args= (5,4,queue1)) #we're setting 3rd argument to queue1 
    p.start() 
    print(queue1.get()) #and we're getting return value: 20 
    p.join() 
    print("ok.") 

Ve bir boru() fonksiyonu da var, ben biz de boru işlevini kullanabilirsiniz düşünüyorum. Ama sıra şimdi benim için çalıştı.

5

Bu yardımcı olur mu? Bu, paralel onları çalıştırır, fonksiyonlar (ve onların argümanları) bir listesini alır ve verir onların çıkışları .: (Bu eskidir. Bunların çoğu daha yeni bir sürümü https://github.com/cpbl/cpblUtilities/blob/master/parallel.py olan)

def runFunctionsInParallel(listOf_FuncAndArgLists): 
    """ 
    Take a list of lists like [function, arg1, arg2, ...]. Run those functions in parallel, wait for them all to finish, and return the list of their return values, in order. 

(This still needs error handling ie to ensure everything returned okay.) 

    """ 
    from multiprocessing import Process, Queue 

    def storeOutputFFF(fff,theArgs,que): #add a argument to function for assigning a queue 
     print 'MULTIPROCESSING: Launching %s in parallel '%fff.func_name 
     que.put(fff(*theArgs)) #we're putting return value into queue 

    queues=[Queue() for fff in listOf_FuncAndArgLists] #create a queue object for each function 
    jobs = [Process(target=storeOutputFFF,args=[funcArgs[0],funcArgs[1:],queues[iii]]) for iii,funcArgs in enumerate(listOf_FuncAndArgLists)] 
    for job in jobs: job.start() # Launch them all 
    for job in jobs: job.join() # Wait for them all to finish 
    # And now, collect all the outputs: 
    return([queue.get() for queue in queues]) 
+0

harika öneri, video işleme için kullandım: http://stackoverflow.com/questions/38203239/multiprocessing-of-video-frames-in-python. Bununla birlikte, bu, yalnızca kuyrukta beslenmeden önce süreçlere katılmadan çalışır - belgelerde de belirtildiği gibi: https://docs.python.org/2/library/multiprocessing.html#programming-guidelines – jlarsch

İlgili konular