Maison >développement back-end >Tutoriel Python >Comment résoudre 'PicklingError: Can't pickle' de Python Multiprocessing ?

Comment résoudre 'PicklingError: Can't pickle' de Python Multiprocessing ?

DDD
DDDoriginal
2024-12-15 08:24:10887parcourir

How to Solve Python Multiprocessing's

PicklingError dans le multitraitement Python

Lors de l'utilisation du multitraitement Python, vous pouvez rencontrer une erreur "PicklingError : Impossible de décaper  : la recherche d'attribut __builtin__.function a échoué ». Cela se produit lorsque vous tentez d'envoyer une fonction à un processus de travail, mais que la fonction n'est pas définie au niveau supérieur d'un module.

Problème de fonction imbriquée

Dans votre cas spécifique, l'erreur peut être provoquée par la fonction que vous décapez appelant une fonction imbriquée. Même si la fonction externe f() est définie au niveau supérieur, si elle appelle une fonction g() qui contient une fonction imbriquée h(), le multitraitement tentera de décaper la fonction imbriquée et échouera.

Solution

Pour résoudre ce problème, déplacez la fonction que vous souhaitez décaper vers le niveau supérieur du module. Alternativement, vous pouvez créer une fonction distincte au niveau supérieur qui appelle la fonction imbriquée et pickle cette fonction à la place.

Par exemple :

# Original code
def f():
    g()

def g():
    h()

# Corrected code
def f():
    wrapper_function()

def wrapper_function():
    g()
    h()

En définissant wrapper_function() au niveau supérieur et en le décapant, vous pouvez éviter l'erreur de décapage.

Supplémentaire Considérations

  • Le décapage des fonctions lambda et des pointeurs de fonction n'est pas pris en charge.
  • Les fonctions qui accèdent à des objets non décapables, tels que les descripteurs de fichiers ou les connexions à une base de données, ne peuvent pas être décapées.
  • C'est généralement une bonne pratique de définir des fonctions au niveau supérieur d'un module si vous avez l'intention de les utiliser dans multitraitement.

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