Maison > Article > développement back-end > La bonne façon d'ouvrir des variables partagées multi-processus basées sur Python
L'article suivant partagera avec vous la bonne façon d'ouvrir des variables partagées multi-processus basées sur Python. Il a une bonne valeur de référence et j'espère qu'il sera utile à tout le monde. Jetons un coup d'oeil ensemble
Plusieurs processus partagent des variables et obtiennent des résultats
En raison des exigences d'ingénierie, plusieurs threads doivent être utilisés pour exécuter un programme . Mais parce que j'ai entendu dire que le multi-threading de Python était faux, j'ai utilisé le multi-processus. Quoi qu'il en soit, les tâches doivent partager moins de paramètres.
Après avoir consulté les informations, j'ai découvert que le multitraitement est principalement utilisé pour implémenter le multi-processus. Il existe deux manières, l'une est Process et l'autre est Pool.
p = Process(target=fun,args=(args))
Utilisez ensuite p.start() pour démarrer un processus enfant et utilisez la méthode p.join() pour créer le processus enfant Le processus parent est exécuté une fois le processus terminé.
Mais c'est très ennuyeux, et je dois écrire une boucle for pour ouvrir n threads et rejoindre.
Il est donc recommandé d'utiliser Pool. Il peut ouvrir un pool de processus de taille fixe, puis chaque thread exécute la fonction apply_async() pour appeler la fonction à exécuter, et enfin se ferme et se joint.
Le code est le suivant :
pathm=Manager().Queue(len(pathlist)) for d in pathlist: pathm.put(d) p=Pool(cp.threads) results=[] for i in range(cp.threads): temp=p.apply_async(ProcessWorker,args=(i,pathm,cp)) results.append(temp) print 'Waiting for all subprocesses done...' p.close() p.join() print 'All subprocesses finish Processing.' results=[r.get() for r in results]
Ci-dessus Le code montre comment utiliser plusieurs processus du pool, comment partager la variable pathm entre les processus du pool et comment obtenir les résultats de l'exécution de la fonction de processus. Il convient de noter que ProcessWorker doit être une fonction illimitée, sinon une erreur sera signalée et la fonction ne pourra pas être récupérée et ne pourra pas être affectée à chaque processus.
cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Fonctions limitées et mécanisme multi-processus de Python
Un concept dérivé de ce qui précède est le concept de fonction limitée et de fonction illimitée.
Après avoir examiné les informations, j'ai conclu comme suit :
Les fonctions limitées sont regroupées dans une classe et ne peuvent être utilisées que lorsque la classe est instanciée La fonction utilisée est limitée par cette instance. Nous appelons souvent ces fonctions méthodes de classe. Par exemple, une méthode de classe qui prend self comme paramètre.
Les fonctions illimitées peuvent être des fonctions qui ne sont pas encapsulées dans une classe, ou elles peuvent être des méthodes statiques dans une classe. Elles sont indépendantes de la classe. Par exemple, une méthode statique dans une classe ne peut pas accéder aux paramètres et autres méthodes de la classe même si elle est définie dans une classe.
Le mécanisme multi-processus de Python doit compiler et empaqueter les méthodes à appeler par chaque processus et les paramètres transmis (comme ProcessWorker dans l'exemple ci-dessus), puis les copier dans chaque processus pour exécution. Si l'entrée est une fonction limitée, alors ses paramètres doivent être la classe à laquelle elle appartient (y compris les paramètres et les méthodes), mais cela ne peut pas être obtenu, et les attributs et méthodes de classe peuvent comporter des pièges, ce qui rend leur empaquetage difficile. Par conséquent, Python limite le fait que les fonctions devant être appelées par plusieurs processus ne puissent pas être des méthodes de classe.
Nous devons mettre les fonctions appelées par plusieurs processus en dehors de la classe, ou les transformer en fonctions statiques. Cependant, les fonctions statiques ne peuvent pas être appelées par les méthodes de la classe à laquelle elles appartiennent (sous la forme self.ProcessWorker). Elles doivent être appelées en externe, comme mc=MyClass(), mc.ProcessWorker ou MyClass(). ProcessWorker.
Recommandations associées :
Méthodes dans les classes décorées basées sur des décorateurs Python
Tableaux et matrices basés sur Python Numpy Explication détaillée de Matrix_python
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!