2016-05-31 6 views
0

Ich verwende das Modul Multiprozessing in Python. Bevor ich meine Hauptfunktion mit der Mapping-Funktion aufrufen kann, muss ich einige Eingaben vom Benutzer erhalten. Mein Problem ist, dass der Code vor der Hauptfunktion mehrfach ausgeführt wird, wenn ich die Hauptfunktion mit pool.map nenne Dieser sehr einfache Code zeigt mein Problem:mehrere Call-Körper Multicoreprocessing Python

from multiprocessing import Pool 
result=range(1,5) 
print('start') 
def test(a): 
    print(a+10) 
if __name__=="__main__": 
    pool = Pool(processes=2) 
    pool.map(test,result) 

meine Ausgabe lautet dann:

start 
start 
11 
12 
13 
14 
start 

Warum wird der Code vor der Testfunktion mehrmals ausgeführt?

+2

Es ist nicht (Python 3.5 hier). Die Reihenfolge der Nummer in der Ausgabe variiert, so dass alles wie erwartet funktioniert. –

+0

aber Start wird immer noch dreimal gedruckt, egal in welcher Reihenfolge es gedruckt wird. Bedeutet das nicht, dass die Druckanweisung und damit der Code vor der Testfunktion dreimal ausgeführt wird, wenn sie nur einmal ausgeführt werden soll? Dieses Problem erstreckt sich auf, wenn ich versuche, einige Eingaben vom Benutzer zu erhalten die Eingabe wird auch mehrmals gefragt – Bruno

+0

Ich kann Ihre Ausgabe nicht reproduzieren - es wird nur "Start" – DomTomCat

Antwort

1

Es zeigt nicht "Start" für mich mit Python 3.4.

Ich kenne Ihre Version von Python nicht, aber es könnte sein, dass in jedem Prozess des Pools Ihre Datei importiert wird und dann die Testfunktion ausgeführt wird. Es bedeutet, dass Code, der "global" geschrieben wurde, einmal zu Beginn des Prozesses ausgeführt wird.

Ich muss zugeben, es ist seltsam, da es bedeutet, dass die Unterprozesse nicht verzweigt sind, sondern das aktuelle Python-Skript selbst starten/importieren.

Wie auch immer, zu PEP8 zu respektieren, sollten Sie es tun mehr auf diese Weise:

from multiprocessing import Pool 

def test(a): 
    print(a+10) 

def main(): 
    result=range(1,5) 
    print('start') 
    pool = Pool(processes=2) 
    pool.map(test,result) 

if __name__=="__main__": 
    main() 
+0

perfekt das funktioniert für mich danke! also das bedeutet, dass, wenn ich ein Skript ausführen will, die pool.map enthält, ich den ganzen Code, den ich nur einmal ausgeführt werden möchte, in seine eigene Funktion setzen muss, oder? – Bruno

+0

Ja tatsächlich. Und im Allgemeinen sollte kein Code an der "Basis" der Datei geschrieben werden, sondern nur Importe, Funktions-/Klassendefinitionen und ein Tail wie --- if \ _ \ _ name \ _ \ _ == "\ _ \ _ main \ _ \ _ "--- wenn die Datei ausgeführt werden soll. – Ronan