2016-08-11 4 views
1

Ich versuche, Multiprocessing in den Kopf zu bekommen. Ich habe eine Liste, ich teile sie in zwei gleich lange Teile, sortiere sie in zwei getrennten Prozessen. Ich weiß, dass dieser Teil funktioniert, weil das Drucken saveto mir die zwei Listen gibt. Aber ich kann nicht auf sie zugreifen, weil ich am Ende zwei leere Listen bekomme. Warum kann ich nicht darauf zugreifen, was ich in l1 und l2 geschrieben habe und wie mache ich das?Parallele Verarbeitung von Listen

import multiprocessing 
import random 


def sort(l, saveto): 
    saveto = sorted(l) 
    print saveto 

if __name__ == '__main__': 

    l = [int(100000*random.random()) for i in xrange(10000)] 

    listlen = len(l) 
    halflist = listlen/2 
    l1 = [] 
    l2 = [] 

    p1 = multiprocessing.Process(target=sort, args=(l[0:halflist], l1)) 
    p2 = multiprocessing.Process(target=sort, args=(l[halflist:listlen], l2)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

    print l1 
    print l2 

Antwort

2

Verwenden multiprocessing.Queue Daten zwischen Prozessen teilen

import multiprocessing 
import random 

def sort(l, queue): 
    queue.put(sorted(l)) 


if __name__ == '__main__': 
    l = [int(100000*random.random()) for i in xrange(10000)] 

    listlen = len(l) 
    halflist = listlen/2 
    queue = multiprocessing.Queue() 

    p1 = multiprocessing.Process(target=sort, args=(l[0:halflist], queue)) 
    p2 = multiprocessing.Process(target=sort, args=(l[halflist:listlen], queue)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

    print queue.get() 
    print queue.get() 

UPDATE:

Da es die große Datenmengen zu Queue setzen stellte sich heraus, ein Deadlock verursachen kann. Dies ist mentioned in the docs:

Warnung

Wie oben erwähnt, wenn ein Kind Prozesselemente in eine Warteschlange gestellt hat (und es nicht JoinableQueue.cancel_join_thread verwendet hat), dann ist das Verfahren nicht beenden, bis alle gepufferte Artikel wurden in die Pipe gespült.

Dies bedeutet, dass Sie einen Deadlock erhalten, wenn Sie versuchen, diesen Prozess beizutreten, es sei denn, Sie sind sicher, dass alle Elemente in der Warteschlange verbraucht worden sind. Wenn der untergeordnete Prozess nicht-dämonisch ist, kann der übergeordnete Prozess bei Beenden ebenfalls hängen bleiben, wenn es versucht, alle seine nicht-dämonischen untergeordneten Elemente beizutreten.

Beachten Sie, dass eine mit einem Manager erstellte Warteschlange dieses Problem nicht aufweist.

Festgelegte Version:

import multiprocessing 
import random 

def sort(l, queue): 
    queue.put(sorted(l)) 


if __name__ == '__main__': 
    l = [int(100000*random.random()) for i in range(10000)] 

    listlen = len(l) 
    halflist = listlen/2 

    manager = multiprocessing.Manager() 
    queue = manager.Queue() 

    p1 = multiprocessing.Process(target=sort, args=(l[0:halflist], queue)) 
    p2 = multiprocessing.Process(target=sort, args=(l[halflist:listlen], queue)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

    print queue.get() 
    print queue.get() 
+0

Das Update funktioniert gut. Vielen Dank. – doc

+0

Sie scheinen nicht gleichzeitig zu laufen. 'p2' scheint zu warten, bis' p1' endet. Wie führe ich sie gleichzeitig? – doc

+0

Sie laufen gleichzeitig. Wenn Sie hinzufügen, um Funktionsschleife mit 'print' und' time.sleep() 'zu sortieren, können Sie es sehen. –

Verwandte Themen