Comment puis-je éviter ce décapage de l'erreur, et quelle est la meilleure façon de paralléliser ce code en Python?
J'ai le code suivant.
def main():
(minI, maxI, iStep, minJ, maxJ, jStep, a, b, numProcessors) = sys.argv
for i in range(minI, maxI, iStep):
for j in range(minJ, maxJ, jStep):
p = multiprocessing.Process(target=functionA, args=(minI, minJ))
p.start()
def functionB((a, b)):
subprocess.call('program1 %s %s %s %s %s %s' %(c, a, b, 'file1',
'file2', 'file3'), shell=True)
for d in ['a', 'b', 'c']:
subprocess.call('program2 %s %s %s %s %s' %(d, 'file4', 'file5',
'file6', 'file7'), shell=True)
abProduct = list(itertools.product(range(0, 10), range(0, 10)))
pool = multiprocessing.Pool(processes=numProcessors)
pool.map(functionB, abProduct)
Il génère l'erreur suivante.
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.6/multiprocessing/pool.py", line 255, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function fa
iled
Le contenu de functionA sont sans importance, et ne produisent pas d'une erreur. L'erreur semble se produire lorsque j'essaie de carte functionB. Comment puis-je supprimer cette erreur, et quelle est la meilleure façon de paralléliser ce code dans la version 2.6 de Python?
- Je me demandais... Ce qui est le but d'utiliser le module multiprocessing ici lorsque vous vous joignez à tous les processus de commencer...principalement à l'exécution d'entre eux en série.
- double possible de Can pas pickle <type 'instancemethod" > lors de l'utilisation de python multitraitement de la Piscine.map()
functionB
il faudrait peut-être le fichier au niveau de la portée, non principaux de la portée. Essayez de le mettre là.- Voici la réponse de stackoverflow.com/questions/1816958/...
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle vous êtes le plus susceptible de voir ce comportement est en raison de l'ordre dans lequel vous définissez votre piscine, les objets et les fonctions.
multiprocessing
n'est pas tout à fait la même que l'utilisation de threads. Chaque processus de spawn et de charger une copie de l'environnement. Si vous créez des fonctions dans les étendues qui peuvent ne pas être disponibles pour les processus, ou de créer des objets à l'avant de la piscine, puis la piscine sera un échec.D'abord, essayez de créer une piscine avant votre grande boucle:
Ensuite, déplacez votre cible appelable à l'extérieur de la dynamique de la boucle:
Considérer cet exemple...
cassé
de travail