Un pool basé sur des threads : une alternative au pool multitraitement
Le multitraitement en Python fournit un mécanisme puissant pour le traitement parallèle utilisant plusieurs processus. La classe multiprocessing.Pool offre une interface pratique pour gérer les processus de travail et distribuer les tâches. Cependant, lorsque des processus lourds ne sont pas souhaitables, existe-t-il une solution similaire qui utilise des threads à la place ?
Oui, il existe un joyau caché dans le module multitraitement qui offre un parallélisme basé sur les threads : la classe ThreadPool. Pour y accéder, importez-le en utilisant :
from multiprocessing.pool import ThreadPool
La classe ThreadPool encapsule une classe Process factice qui exécute en interne un thread Python. Cette approche permet une API multitraitement basée sur les threads, similaire à la classe Pool standard. Mais contrairement aux processus de travail, les threads partagent la mémoire, ce qui réduit potentiellement les frais généraux.
L'utilisation de ce ThreadPool basé sur les threads reflète celle du pool standard. Par exemple, pour paralléliser une opération de carte à l'aide de threads :
def long_running_func(p): c_func_no_gil(p) pool = ThreadPool(4) xs = pool.map(long_running_func, range(100))
Notez que dans ce scénario, le GIL n'est pas un problème car la fonction sous-jacente le libère avant d'effectuer des opérations liées aux E/S. Ainsi, pour les tâches gourmandes en E/S, le ThreadPool peut fournir une amélioration significative des performances tout en évitant les frais généraux liés à la création et à la gestion des processus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!