32.6 Einblick in das Modul multiprocessing 

Das Modul multiprocessing bietet eine objektorientierte Schnittstelle zur Verwaltung mehrerer Prozesse. Die Handhabung von multiprocessing ist dabei eng an die des Moduls threading aus Abschnitt 32.5 angelehnt, wobei die Klasse multiprocessing.Process das Pendant zur Klasse threading.Thread darstellt.
Als Beispiel betrachten wir erneut den interaktiven Primzahltest, wobei anstelle von Threads Prozesse zur Parallelisierung verwendet werden.
import multiprocessing
class PrimzahlProzess(multiprocessing.Process):
def __init__(self, zahl, einauslock):
super().__init__()
self.Zahl = zahl
self.EinAusLock = einauslock
def run(self):
i = 2
while i*i <= self.Zahl:
if self.Zahl % i == 0:
with self.EinAusLock:
print("{} ist nicht prim, "
"da {} = {} * {}".format( self.Zahl,
self.Zahl, i, self.Zahl // i))
return
i += 1
with self.EinAusLock:
print("{} ist prim".format(self.Zahl))
if __name__ == "__main__":
meine_prozesse = []
EinAusLock = multiprocessing.Lock()
eingabe = input("> ")
while eingabe != "e":
try:
prozess = PrimzahlProzess(int(eingabe), EinAusLock)
meine_prozesse.append(prozess)
prozess.start()
except ValueError:
with EinAusLock:
print("Falsche Eingabe!")
with EinAusLock:
eingabe = input("> ")
for p in meine_prozesse:
p.join()
Im Vergleich zur Thread-Version des Programms gibt es zwei wesentliche Unterschiede.
Erstens müssen wir dafür sorgen, dass jeder neu gestartete Prozess die Datei importieren kann, ohne dass dadurch erneut der Code zum Erzeugen der Unterprozesse ausgeführt wird. Dafür prüfen wir mit der Variablen __name__, ob das Python-Programm direkt mit dem Interpreter ausgeführt oder importiert wurde. Wenn das Modul importiert worden ist, wird der Code im if-Block nicht ausgeführt.[ 136 ](Dieses Problem haben wir im Abschnitt über concurrent.futures in der gleichen Weise gehabt und gelöst. )
Zweitens können wir keine gemeinsamen Variablen mehr verwenden, um Daten zwischen den Prozessen auszutauschen. Dies gilt auch für das Lock-Objekt, das wir in der Thread-Version als Klassenattribut der Klasse PrimzahlThread realisiert haben. Wir umgehen das Problem, indem wir im Hauptprozess ein Lock-Objekt anlegen, das wir dann als zusätzlichen Parameter an die Unterprozesse übergeben.