La bonne façon d'ouvrir des variables partagées multi-processus basées sur Python

不言
Libérer: 2018-04-28 15:55:29
original
2885 Les gens l'ont consulté

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))
Copier après la connexion


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]
Copier après la connexion


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&#39;t pickle <type &#39;instancemethod&#39;>: attribute lookup __builtin__.instancemethod failed
Copier après la connexion


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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!