Maison  >  Article  >  développement back-end  >  Comment partager une file d'attente en toute sécurité entre les processus de travail dans le module multitraitement de Python ?

Comment partager une file d'attente en toute sécurité entre les processus de travail dans le module multitraitement de Python ?

DDD
DDDoriginal
2024-10-19 18:47:02785parcourir

How to Share a Queue Safely Between Worker Processes in Python's Multiprocessing Module?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn