2013-02-11 2 views
8

Ich versuche, mit Pythons Multiprocessing-Modul, insbesondere die apply_async-Methode von Pool zu bekommen. Ich versuche eine Funktion mit Argumenten und Schlüsselwortargumenten aufzurufen. Wenn ich die Funktion ohne kwargs rufen dann ist es in Ordnung, aber wenn ich in einem Schlüsselwort-Argument hinzuzufügen versuchen, erhalte ich: TypeError: apply_async() got an unexpected keyword argument 'arg2' Unten ist der Test-Code, der ich bin mitWie verwende ich Schlüsselwortargumente mit Python-Multiprozessor-Pool apply_async

#!/usr/bin/env python 
import multiprocessing 
from time import sleep 
def test(arg1, arg2=1, arg3=2): 
    sleep(5) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool() 
    for t in range(1000): 
     pool.apply_async(test, t, arg2=5) 
    pool.close() 
    pool.join() 

Wie kann ich die Funktion so aufrufen, dass es akzeptiert Schlüsselwortargumente?

Antwort

14

Pass das Schlüsselwort args in einem Wörterbuch (und die Positionsargumente in einem Tupel):

pool.apply_async(test, (t,), dict(arg2=5)) 
+0

, die dank gearbeitet! – cts

1

Janne Antwort nicht für mich 2.7.11 in Python nicht funktioniert (nicht sicher, warum). Die Funktion test() erhielt den Schlüssel (arg2), nicht den Wert (5).

Ich reparierte diese durch einen Wrapper um Test zu erstellen:

def test2(argsDict): 
    test(**argsDict) 

Dann

Aufruf
pool.apply_async(test2, (t,), [dict(arg2=5)]) 
+0

Die Sache ist, wenn es ein Wrapper ist, brauchen wir keine Schlüsselwortargumente :) Ich auch bestätigen das Problem des Tests, der den Schlüssel empfängt –