concurrent.futures Notes d'utilisation

concurrent.futures

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

Un nouveau package standard dans Python 3.2 qui facilite l'implémentation d'un traitement de tâches parallèle multi-thread et multi-processus.

ThreadPoolExecutor et ProcessPoolExecutor sont implémentés en héritant de la classe de base appelée Executor, et vous pouvez écrire avec presque la même interface en utilisant l'un ou l'autre.

Installation

Puisqu'il s'agit d'un package standard en Python 3.2, il n'est pas nécessaire de l'installer. Backport est disponible pour les versions 2.6 et supérieures.

python


pip install futures

Exemple de code

import concurrent.futures
import hashlib

def digest(t): #Fonction pour consommer les ressources du processeur de manière appropriée
    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]

    #Créer un objet Executor
    executor = concurrent.futures.ProcessPoolExecutor(max_workers=4)

    #Soumettez la tâche à l'objet Executor et obtenez le même nombre d'objets futurs.
    #L'exécution de la tâche est soumise()Cela commence à partir du moment où vous appelez.
    futures = [executor.submit(digest,t) for t in task_list]

    #Attendez la fin de chaque futur et obtenez le résultat.
    # as_completed()Renvoie un itérateur qui parcourt les éléments des futurs donnés dans l'ordre d'achèvement.
    #Si aucune tâche n'est terminée, elle sera bloquée jusqu'à ce qu'une tâche soit terminée.
    for future in concurrent.futures.as_completed(futures):
        print(future.result()) # digest()La valeur de retour de s'affiche.

    #Attendez que toutes les tâches soient terminées et nettoyées.
    #Toutes les tâches non terminées seront bloquées.
    # (Un fils_Puisque nous répétons tout terminé, il ne devrait pas y avoir de tâches qui n'ont pas été terminées à ce stade.)
    executor.shutdown()

Si vous remplacez ProcessPoolExecutor par ThreadPoolExecutor, il fonctionnera en multi-thread au lieu de multi-processus.

point important

Recommended Posts

concurrent.futures Notes d'utilisation
notes d'utilisation du décorateur python
Remarques sur l'utilisation du test unittest standard Python
python * args, ** kwargs Notes d'utilisation
Remarques pratiques sur l'utilisation de la commande diff
concurrents.futures
Mémo SQLAlchemy
notes de pyenv
Notes SQL
Notes de pandas
Mémo Sphinx
Mémo Django
ipython + jupyter + plotly (matplotlib) Paramètres et notes d'utilisation
Jupyter_learning notes_000
Mémo Django