Ich werde es nicht mehr schwer haben. .. Multiprozess mit Pythons Standardbibliothek.

Überblick

Multi-Prozess, machen wir es einfach. Aber ich war ein bisschen im Weg und konnte doch keine Zeit sparen. .. ?? ??

Es ist unmöglich. .. .. .. .. Normalerweise für Satz. .. .. ..

Ich möchte, dass eine solche Person es liest.

Verwenden Sie ProcessPoolExecutor und functools.partial, die Standardausrüstung von Python, um bequem parallele Berechnungen in mehreren Prozessen durchzuführen. Was Sie verwenden können, ist ein Verlust, wenn Sie es nicht verwenden, richtig? ??

Situationserklärung

test.py



def my_function(arg1):
    for i in range(100):
        'Es ist ein sehr schwerer Prozess.'
        result_list.append(some_operation(i))

if __name__ == "__main__":
    my_function()

Du schreibst so, ohne an irgendetwas zu denken, oder? In einem solchen Fall gibt es 100 Prozesse, aber ich möchte problemlos parallele Prozesse in mehreren Prozessen ausführen. .. ..

Einfacher Weg

  1. Schreiben Sie die Funktion ein wenig um.
  2. Importieren Sie ProcessPoolExecutor.
  3. Importieren Sie functools.partial und ordnen Sie die Funktion zu.

1. Schreiben Sie die Funktion ein wenig um.

Schreiben Sie das vorherige `` `my_function``` so.

test.py


def my_function(index, arg1):
    return some_operation(index)

Mit anderen Worten, anstatt eine Schleife zu schreiben, ist es so, als würde man einen Index übergeben und einzeln verarbeiten.

2. Importieren Sie ProcessPoolExecutor.

Schreiben Sie zunächst wie folgt.

test.py


import os
from concurrent.futures import ProcessPoolExecutor

max_workers = os.cpu_count() or 4
print('=====MAX WORKER========')
print(max_workers)

with ProcessPoolExecutor(max_workers=max_workers) as executor:

max_workersSpeichert die Anzahl der verfügbaren Prozesse. Wenn es in diesem Beispiel nicht gespeichert werden kann4Wird eingegeben.

3. Importieren Sie functools.partial und ordnen Sie die Funktion zu.

Als nächstes schreiben Sie so.

test.py


import functools

with ProcessPoolExecutor(max_workers=max_workers) as executor:
    result_list = list(executor.map(functools.partial(my_function, arg1), range(100)))
    executor.shutdown(wait=True)

Nur das. Um ein wenig zu erklären, die Operationen, die ich verwendet habe, um in eine Schleife zu schreiben und an `` `result_listanzuhängenmy_funtion```Durch Übergeben des Index an wird die Operation an jedem Index in mehreren Prozessen ausgeführt.

functools.Teilweise ist eine Funktion (meine_Ändern Sie einige der Argumente der Funktion) und geben Sie jede Funktion mit unterschiedlichen Argumenten als Funktionsiterator zurück. Zu diesem Zeitpunkt mein_function(index, arg1)Wie in gibt es nur ein Argument, das geändert werden kann, nämlich das erste Argument der Funktion.**Hinweis!!**



 Darüber hinaus wird gemäß der ausführbaren Datei der Index, der die erste Variable ist, die an diese "my_function" übergeben wird, in jedem der Iteratorbereiche (100) parallel ausgeführt, und jedes Ausführungsergebnis wird in der Liste gespeichert.
 Dies ist genau das gleiche wie beim Anhängen an `` `result_list``` in jeder Schleife.


## Zusammenfassung
 Multiprozess, den Sie ausführen möchten, um auch nur wenig Zeit zu sparen. Es ist schmerzhaft, wenn es schwierig ist, mehrere Prozesse zu schreiben und sich viel Zeit zu nehmen. .. ..
 Dieses Mal habe ich einen Multi-Prozess eingeführt, den Sie ganz einfach nur mit der Standard-Python-Bibliothek schreiben können! !!

 Ende.



Recommended Posts

Ich werde es nicht mehr schwer haben. .. Multiprozess mit Pythons Standardbibliothek.
Ich habe versucht, eine Bibliothek (Common Thread) zu verwenden, die die Verwendung des Python-Threading-Pakets vereinfacht
Zeitmessung mit einer Uhr
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe eine Instanz zu einem bestimmten Zeitpunkt mit AWS Lambda gestoppt