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

DDD
Libérer: 2024-10-19 18:47:02
original
784 Les gens l'ont consulté

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))
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!