2017-03-02 4 views
1

Noch etwas Anfänger in Python. Nicht sicher, warum dies druckt ein leeres Array, wenn ich ein Array erwarte mit fünf 2sPython Multiprozessing-Pool async_apply Callback funktioniert nicht, wenn Argumente übergeben

from multiprocessing import Pool 

results = [] 

def func(a=1): 
    if a == 1: 
     return 1 
    return 2 

def collect_results(result): 
    results.append(result) 

if __name__=="__main__": 

    poolObjects = [] 

    pool = Pool(processes=2) 

    poolObjects = [pool.apply_async(func, args=(2), callback=collect_results) for i in range(5)] 

    pool.close() 
    pool.join() 

    print results 

Aber wenn ich ändern, um die poolObjects Linie auf diese

poolObjects = [pool.apply_async(func, callback=collect_results) for i in range(5)] 

Es funktioniert gut, und druckt eine Reihe von fünf 1s. Was mache ich hier falsch?

+1

Try 'args = zu ändern (2) 'zu' args = (2,) '(notieren Sie das Komma). '(2)' ist genau das gleiche wie nur '2', * das Komma erzeugt Tupel *! – Bakuriu

Antwort

1

Ihr Problem besteht darin, wie Sie das Argument übergeben: args muss ein Tupel (oder Sequenz) sein. So ändern

... args=(2) ... 

zu

... args=(2,) ... 

Die Hinter Komma ein Tupel der Länge eins erzeugt, welche die ganze Zahl 2.

Dann wird Ihr Programm

[2, 2, 2, 2, 2] 

so gedruckt werden, warum hast du keinen Fehler bekommen? Du hast es getan ;-) - aber es wurde unterdrückt. Der Fehler tritt nicht im Hauptprogramm auf, sondern in der Hintergrund-Maschinerie, die Arbeit über Prozessgrenzen hinweg senden möchte. Es gibt einfach keinen guten Weg, solche Fehler zu melden, daher werden sie unterdrückt.

Im Fall von apply_async wird der Fehler gespeichert und wartet darauf, dass Sie .get() auf das Ergebnisobjekt anwenden.

So, zum Beispiel, fügen Sie diese Schleife bis zum Ende des ursprünglichen Programms:

for f in poolObjects: 
    f.get() 

Dann werden die unterdrückt Fehler gemeldet werden, etwa so:

TypeError: func() argument after * must be a sequence, not int 
+0

Vielen Dank für die zusätzlichen Informationen über den Fehler !! Der ursprüngliche Code, den ich hatte, enthält mehrere Parameter und es ist tatsächlich aus einem anderen Grund fehlgeschlagen (jetzt, dass ich den Fehler sehen kann :)). Der Beispielcode, den ich geschrieben habe, scheitert wegen der fehlenden, aber ich dachte, der Grund wäre derselbe. – ski

Verwandte Themen