[PYTHON] concurrent.futures Verwendungshinweise

concurrent.futures

http://docs.python.jp/3/library/concurrent.futures.html

Ein neues Standardpaket in Python 3.2, mit dem die parallele Taskverarbeitung mit mehreren Threads und Prozessen problemlos implementiert werden kann.

ThreadPoolExecutor und ProcessPoolExecutor werden durch Erben der Basisklasse Executor implementiert, und Sie können mit beinahe derselben Schnittstelle schreiben.

Installation

Da es sich um ein Standardpaket in Python 3.2 handelt, muss es nicht installiert werden. Backport ist für 2.6 und höher verfügbar.

python


pip install futures

Beispielcode

import concurrent.futures
import hashlib

def digest(t): #Funktion zum angemessenen Verbrauch von CPU-Ressourcen
    hash = hashlib.sha256()
    for i in range(t*1000000):
        hash.update('hogehoge')
    return hash.hexdigest()

if __name__=='__main__':

    task_list = [1,1,1,2,2,3]

    #Erstellen Sie ein Executor-Objekt
    executor = concurrent.futures.ProcessPoolExecutor(max_workers=4)

    #Senden Sie die Aufgabe an das Executor-Objekt und erhalten Sie die gleiche Anzahl zukünftiger Objekte.
    #Die Aufgabenausführung ist Senden()Es beginnt ab dem Moment, in dem Sie anrufen.
    futures = [executor.submit(digest,t) for t in task_list]

    #Warten Sie auf den Abschluss jeder Zukunft und erhalten Sie das Ergebnis.
    # as_completed()Gibt einen Iterator zurück, der die Elemente der angegebenen Futures in der Reihenfolge ihrer Fertigstellung durchläuft.
    #Wenn keine Aufgabe abgeschlossen ist, wird sie blockiert, bis eine abgeschlossen ist.
    for future in concurrent.futures.as_completed(futures):
        print(future.result()) # digest()Der Rückgabewert von wird angezeigt.

    #Warten Sie, bis alle Aufgaben abgeschlossen und bereinigt sind.
    #Nicht erledigte Aufgaben werden blockiert.
    # (Einen Sohn_Da alles erledigt ist, sollte es keine Aufgaben geben, die zu diesem Zeitpunkt noch nicht erledigt wurden.)
    executor.shutdown()

Wenn Sie "ProcessPoolExecutor" durch "ThreadPoolExecutor" ersetzen, funktioniert dies in mehreren Threads anstelle von mehreren Prozessen.

wichtiger Punkt

Recommended Posts

concurrent.futures Verwendungshinweise
Verwendungshinweise für Python Decorator
Hinweise zur Verwendung des Python-Standards unittest
python * args, ** kwargs Verwendungshinweise
Bequeme Hinweise zur Verwendung von Diff-Befehlen
concurrent.futures
SQLAlchemy note
pyenv Notizen
SQL-Notizen
Pandas Notizen
Sphinx-Memo
Django Memo
ipython + jupyter + plotly (matplotlib) Einstellungen und Verwendungshinweise
Jupyter_Lernen Notizen_000
Django Memo