Maison >développement back-end >Tutoriel Python >Comment partager une file d'attente en toute sécurité entre les processus de travail dans le module multitraitement de Python ?
Partage d'une file d'attente entre plusieurs processus de travail
Le module multitraitement fournit des mécanismes permettant de créer et de gérer plusieurs processus pour effectuer des tâches simultanément. Un cas d'utilisation courant consiste à demander aux processus de travail de rapporter leurs résultats à un processus central. C'est là que les files d'attente entrent en jeu. Cependant, lorsque vous utilisez apply_async pour générer des processus de travail, partager une file d'attente entre eux peut être difficile.
L'erreur : mettre les objets en file d'attente pour l'héritage uniquement
Lors de la tentative de transmission d'un file d'attente directement à apply_async, vous pouvez rencontrer une RuntimeError : "Les objets de file d'attente ne doivent être partagés qu'entre les processus par héritage." Cette erreur signifie que les instances de file d'attente ne peuvent être partagées qu'entre des processus directement liés par héritage. Dans le code fourni, le processus de travail n'est pas hérité du processus principal, d'où l'erreur.
Solution : Utilisation de multiprocessing.Manager
Pour surmonter cette restriction d'héritage, le multitraitement fournit la classe Manager. Manager fournit un moyen de créer des objets pouvant être partagés entre plusieurs processus, y compris les files d'attente. En utilisant Manager, nous pouvons créer une file d'attente accessible à tous les processus de travail sans avoir besoin d'héritage.
Code refactorisé :
Le code suivant montre comment partager une file d'attente parmi les processus de travail utilisant multiprocessing.Manager :
import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) m = multiprocessing.Manager() q = m.Queue() workers = pool.apply_async(worker, (33, q))
Dans ce code, Manager() crée une instance de gestionnaire, m, qui est ensuite utilisée pour instancier une file d'attente partagée, q. La file d'attente est passée en argument à la méthode apply_async, permettant aux processus de travail d'y accéder et d'y écrire des résultats. Cette approche permet la communication entre les processus de travail et le processus principal via la file d'attente partagée, éliminant ainsi le risque d'erreurs d'héritage.
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!