anderer code in script mit multiprocessing

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tecumseh
User
Beiträge: 14
Registriert: Samstag 28. April 2012, 11:50

Hey Leute,

ich denke das ist eine triviale Frage, aber ich finde die Antwort nicht.

Folgendes simples Beispiel:

Code: Alles auswählen

import multiprocessing

print 'hallo'

def test(b):
        c = 1/2.0 + b
        return c

if __name__=='__main__':
    p = multiprocessing.Pool(3)
    liste = p.map(test,range(10))
    print liste
Der Output sollte eigentlich dann folgender sein:

hallo
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]

Der Output den ich bekomme sieht aber so aus:

hallo
hallo
halloh
allo
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]


Ich kann mir zwar schon erklären warum das so aussieht, nämlich weil offenbar das ganze Skript für jeden Prozess durchlaufen wird, aber was mache ich dagegen?
Muss doch möglich seinen in einem Skript einen Code mit Multiprocessing zu nutzen und zusätzlich auch anderen Code. Oder nicht?

--> Ich wollte das Problem lösen in dem ich mir ein Modul was nur den Multiprocessing-Teil enthält geschrieben habe, um das dann in ein anderes Skript reinzuladen. Da wird aber nicht der richtige Output, sondern der Wert "None" übergeben.

Ich nutze Python 2.7 unter Windows 7 32-bit

Danke schon mal!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Weil multiprocessing mehrere Prozesse startet wird das print auch mehrmals ausgeführt.

Deshalb sollte jedes Programm keinen Code einfach so ausführen und die Hauptroutine
in einem

Code: Alles auswählen

if __name__=='__main__':
    main()
gekapselt sein.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Vielleicht ergänzend: multiprocessing startet einen neuen Prozess in dem natürlich dein komplettes Script geladen wird, nicht nur die Funktion die du aufrufst. Das macht spätestens dann Sinn, wenn man sich in Erinnerung ruft, dass in der aufgerufenen Funktion andere Funktionen aufgerufen werden können oder globale, im Script verwendete, Variablen benötigt werden.
Zuletzt geändert von sparrow am Dienstag 12. Februar 2013, 23:14, insgesamt 1-mal geändert.
Tecumseh
User
Beiträge: 14
Registriert: Samstag 28. April 2012, 11:50

Super, das ging fix, danke!!
Tecumseh
User
Beiträge: 14
Registriert: Samstag 28. April 2012, 11:50

Aber:

wie würde ich nun aber ein Modul mit einem Multiprocessing-Code laden und auch Werte aus denen geladenen Funktionen bekommen?
BlackJack

@Tecumseh: In dem Du die Funktionen mit den entsprechenden Funktionen/Methoden aus dem `multiprocessing`-Modul aufrufst.
Antworten