Heim  >  Artikel  >  Backend-Entwicklung  >  Eine ausführliche Erklärung der MultiProcessing-Bibliothek in Python

Eine ausführliche Erklärung der MultiProcessing-Bibliothek in Python

巴扎黑
巴扎黑Original
2017-07-18 14:02:402563Durchsuche

Das MultiProcessing-Modul ist ein hervorragendes Paket, das dem Multithread-Modul MultiThreading für den Umgang mit Parallelität ähnelt.
Ich bin schon ein wenig mit dieser Bibliothek in Berührung gekommen, habe sie dieses Mal jedoch nicht näher untersucht war gelangweilt und studierte es ein wenig, um meine Verwirrung zu klären.
Heute werden wir die Methoden apply_async und map untersuchen. Gerüchten zufolge weisen diese beiden Methoden Prozesse im Prozesspool verwandten Funktionen zu. Ich möchte dies überprüfen.
Sehen Sie sich die Erklärung dieser beiden auf der offiziellen Website an:
apply_async(func[, args[, kwds[, callback[, error_callback]]]])
Eine Variante der apply()-Methode, die a zurückgibt Ergebnisobjekt.

Wenn Callback angegeben ist, sollte es ein Callable sein, das ein einzelnes Argument akzeptiert. Wenn das Ergebnis bereit ist, wird ein Callback darauf angewendet, es sei denn, der Aufruf ist fehlgeschlagen. In diesem Fall wird error_callback angewendet Stattdessen.

Wenn error_callback angegeben ist, sollte es sich um eine aufrufbare Funktion handeln, die ein einzelnes Argument akzeptiert. Wenn die Zielfunktion fehlschlägt, wird error_callback mit der Ausnahmeinstanz aufgerufen.

Callbacks sollten sofort abgeschlossen werden da sonst der Thread, der die Ergebnisse verarbeitet, blockiert wird.


map(func, iterable[, chunksize])
Ein paralleles Äquivalent der integrierten Funktion „map()“ (sie unterstützt nur (ein iterierbares Argument). Es blockiert, bis das Ergebnis fertig ist.

Diese Methode zerlegt das iterierbare Argument in mehrere Blöcke, die es als separate Aufgaben an den Prozesspool übermittelt kann angegeben werden, indem die Chunkgröße auf eine positive Ganzzahl gesetzt wird.

Der Pool kann Benutzern eine bestimmte Anzahl von Prozessen zum Aufrufen bereitstellen. Wenn eine neue Anfrage an den Pool gesendet wird und der Pool nicht voll ist, wird eine neue angefordert Der Prozess wird zum Ausführen der Anfrage verwendet. Wenn die Anzahl der Prozesse im Pool jedoch das angegebene Maximum erreicht hat, wartet die Anfrage, bis ein Prozess im Pool endet, und dann wird ein neuer Prozess zur Ausführung erstellt it

Werfen wir einen Blick auf das Programm:

from multiprocessing import Poolimport timeimport osdef func(msg):print('msg: %s %s' % (msg, os.getpid()))
    time.sleep(3)print("end")if __name__ == '__main__':
    pool = Pool(4)for i in range(4):
        msg = 'hello %d' % (i)
        pool.apply_async(func, (msg, ))# pool.map(func, range(4))print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")
    pool.close()
    pool.join()   # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print("Sub-process(es) done.")

Laufergebnisse:

Entfernen Sie die Ordnen Sie Anmerkungen zu und fügen Sie Anmerkungen zur Funktion apply_async hinzu

Sehen Sie sich das Programm und die Ausführungsergebnisse an, wenn nicht genügend Prozesse im Prozesspool vorhanden sind:

from multiprocessing import Poolimport timeimport osdef func(msg):print('msg: %s %s' % (msg, os.getpid()))
    time.sleep(3)print("end")if __name__ == '__main__':
    pool = Pool(3)'''for i in range(4):
        msg = 'hello %d' % (i)
        pool.apply_async(func, (msg, ))'''pool.map(func, range(4))print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")
    pool.close()
    pool.join()   # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print("Sub-process(es) done.")

Programmergebnisse:

Sie können das erkennen, wenn die Anzahl der Prozesse im Prozesspool größer oder gleich der Anzahl der Male der Funktion ist Muss ausgeführt werden, läuft es reibungslos und die Ergebnisse sind natürlich. Wenn jedoch die Anzahl der Prozesse im Prozesspool geringer ist als die Anzahl der auszuführenden Funktionen, wird ein Prozess blockiert, dh zwei oder mehr Funktionen teilen sich einen Prozess.
Darüber hinaus wird der zweite Parameter der Funktion apply_async in einem Parameterwert übergeben. Beachten Sie, dass er bei Bedarf asynchron ist Um mehrere Prozesse zuzuweisen, benötigen Sie eine for-Schleife oder eine while-Schleife für die Map-Funktion. Der zweite Parameterwert ist ein Iterator, sodass keine for-Schleife erforderlich ist. Denken Sie daran, was diese beiden Funktionen implementieren, ist die Zuweisung von Prozessen im Prozesspool nacheinander zu Funktionen.

Übrigens ist die offizielle Website von MultiProcessing, die komplett auf Englisch ist, sehr verwirrend und mühsam zu lesen, aber ich muss auch sagen, dass sie für Englisch sehr hilfreich ist...

Das obige ist der detaillierte Inhalt vonEine ausführliche Erklärung der MultiProcessing-Bibliothek in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn