Lorsque vous essayez d'utiliser le module multitraitement de Python, vous pouvez rencontrer le message "PicklingError : Can't pickle
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()
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()
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!