Maison > développement back-end > Tutoriel Python > Pourquoi le multitraitement Python échoue-t-il avec « PicklingError : Can't pickle » et comment puis-je y remédier ?

Pourquoi le multitraitement Python échoue-t-il avec « PicklingError : Can't pickle » et comment puis-je y remédier ?

Barbara Streisand
Libérer: 2024-12-08 20:33:12
original
345 Les gens l'ont consulté

Why Does Python Multiprocessing Fail with

Dépannage « PicklingError : Impossible de décaper " dans Python Multiprocessing

Lorsque vous essayez d'utiliser le module multitraitement de Python, vous pouvez rencontrer le message "PicklingError : Can't pickle " erreur. Cela se produit souvent lorsque l'on tente de décaper une fonction qui n'est pas définie au niveau supérieur d'un module.

Comprendre le décapage

Le décapage est un processus qui convertit un objet en un flux binaire, permettant de le stocker puis de le recréer ultérieurement. En multitraitement, les tâches sont transmises sur le réseau via une file d'attente, ce qui nécessite qu'elles soient sélectionnables.

Fonctions et définition de niveau supérieur

Fonctions régulières définies au niveau supérieur d'un module sont intrinsèquement décapables. Cependant, les fonctions définies dans une classe ou une autre fonction imbriquée ne le sont pas. En effet, les « globaux » rencontrés lors du décapage peuvent ne pas être les mêmes que ceux du processus qui les a créés.

Exemple de fonction non décapable

Considérez le code suivant qui définit une fonction imbriquée dans une méthode de classe :

class Foo:
    def g(self):
        def h():
            pass
        h()
Copier après la connexion

Appel pool.apply_async(Foo().g) entraînera "PicklingError" car la fonction imbriquée h n'est pas définie au niveau supérieur.

Solution

À pour résoudre ce problème, définissez simplement la fonction au niveau supérieur du module et appelez-la depuis la fonction imbriquée. Par exemple :

def g(foo):
    def h():
        pass
    h()
    foo.work()
Copier après la connexion

Maintenant, pool.apply_async(g, args=(Foo(),)) fonctionnera correctement.

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.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal