Maison >développement back-end >Tutoriel Python >Pourquoi le multitraitement échoue-t-il avec « Can't Pickle InstanceMethod » et comment puis-je y remédier ?
En multitraitement, la fonction Pool.map() divise les tâches entre les processus pour une exécution simultanée. Cependant, vous pouvez rencontrer une erreur lors de l'utilisation de méthodes liées, comme démontré dans le code donné :
import multiprocessing def f(x): return x*x def go(): pool = multiprocessing.Pool(processes=4) print pool.map(f, range(10)) if __name__== '__main__' : go()
Ce code fonctionne de manière transparente. Cependant, l'utilisation d'une approche plus orientée objet peut échouer avec l'erreur :
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Cette erreur se produit lorsque vous essayez d'utiliser Pool.map() avec une méthode liée, comme le montre le code suivant :
import someClass if __name__== '__main__' : sc = someClass.someClass() sc.go() class someClass(object): def __init__(self): pass def f(self, x): return x*x def go(self): pool = multiprocessing.Pool(processes=4) print pool.map(self.f, range(10))
Résolution :
Le problème découle de l'exigence du multitraitement pour décaper les objets afin de les répartir entre les processus. Cependant, les méthodes liées ne sont pas intrinsèquement décapables. La solution consiste à créer l'infrastructure nécessaire pour permettre leur décapage.
Une approche consiste à utiliser la méthode de bibliothèque standard copy_reg pour enregistrer les fonctions de décapage et de décapage. Par exemple, la contribution de Steven Bethard à un fil de discussion connexe offre une approche viable pour le décapage et le décapage de méthodes à l'aide de copy_reg.
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!