Reference Problem mit multiprocessing

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
patrice079
User
Beiträge: 13
Registriert: Sonntag 15. April 2012, 13:22

Hallo,

ich habe ein kleines Problem mit dem multiprocessing modul. Ausgangssituation ist, ich fülle eine Liste (data_stack) mit ndarrays die ich dann an einen Pool übergebe:

Code: Alles auswählen

pool = multiprocessing.Pool(processes=threads)
job_args = [(processors, params, dat,) for dat in data_stack] # data_stack liste mit Elementen [int, ndarray]
pool.map(helper, job_args)
helper sieht folgendermaßen aus:

Code: Alles auswählen

def helper(args):
    worker(*args)

def worker(processors, params, data):
    # loop over each processor
    for n, compute in enumerate(processors):
        compute(data[1], params) # <- data[1] type ndarray
Das Problem ist, dass data in worker leider als Kopie übergeben wird und somit eine andere Adresse hat und meine übergeben ndarrays in data_stack folglich leer bleiben. Sorry wenn die Frage naiv ist, aber ich stehe etwas auf dem Schlauch wie ich das Problem löse. Der compute Funktion wird data[1], also das ndarray, nämlich wieder als Referenz übergeben, nur dem worker leider nicht. Denke das es daran liegt, dass multiprocessing die objekte pickled, aber wie würde ich das dann lösen? Wäre für jede Hilfe dankbar.

Mfg,
patrice
BlackJack

@patrice079: Multiprocessing ist ja für mehrere Prozesse gedacht und da kann es keine gemeinsamen Adressen geben (stimmt nicht ganz, aber im Allgemeinen halt schon). Du müsstest die Ergebnisse wieder zurückgeben lassen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sofern compute() die meiste Zeit in numpy o.ä. C libraries verbringt stellt sich die Frage ob es nicht ohnehin sinnvoller ist Threads zu nutzen. Sofern numpy den GIL released, wovon ich mal ausgehe, kommt dir dieser ja nicht dazwischen.
patrice079
User
Beiträge: 13
Registriert: Sonntag 15. April 2012, 13:22

Danke Euch. @BlackJack, das ist die Lösung.
Antworten