[Python] Il semble que les variables globales ne puissent pas être référencées en multitraitement

Je n'avais pas de rapport à ce sujet, alors je vais déposer une note.

En Python, le module standard Multiprocessing vous permet d'effectuer des calculs parallèles. Le calcul parallèle matériel comme le GPU n'est pas pris en charge, il s'agit simplement d'un traitement multi-processus sur le CPU.

Les éléments de la liste d'arguments groupés sont passés aux arguments de la fonction que vous souhaitez traiter en parallèle.

Si vous écrivez un script qui fait référence à des variables globales dans une fonction qui est traitée en parallèle, ce sera comme suit.

example.py


import multiprocessing as mp

a = 0

def init_global():
    global a
    a = 100

def func(proc):
    global a
    print("Inside MultiProcess: ", proc, a)
    return a

if __name__ == "__main__":

    print("Before Change", a)

    init_global()

    print("After Change", a)

    pool = mp.Pool(4)
    callback = pool.map(func, range(4))
    pool.terminate()
    pool.join()

    print(sum(callback))

résultat 2017-03-14_150753.jpg Comme vous pouvez le voir, vous pouvez faire référence et affecter dans une fonction normale (init_global), mais vous ne pouvez pas faire référence à une variable globale dans une fonction qui est traitée en parallèle.


Si vous voulez vraiment faire référence à la valeur de la variable globale dans la fonction de traitement parallèle, il semble que vous deviez spécifier l'argument de l'appelant. (Si vous souhaitez passer plusieurs arguments, vous devez générer un taple)

example.py


import multiprocessing as mp

a = 0
b = 1111

def init_global():
    global a
    a = 100

def func(proc):
    print("Inside MultiProcess: ", proc[0], proc[1])
    return proc[0]

if __name__ == "__main__":

    print("Before Change", a)

    init_global()

    print("After Change", a)

    pool = mp.Pool(4)
    args = [(a,b) for i in range(4)]
    callback = pool.map(func, args)
    pool.terminate()
    pool.join()

    print(sum(callback))

résultat 2017-03-14_151709.jpg J'ai pu le remettre.

Il y a peut-être une méthode appropriée, mais je ne l'ai pas trouvée, alors veuillez indiquer s'il existe une meilleure méthode.

Recommended Posts

[Python] Il semble que les variables globales ne puissent pas être référencées en multitraitement
traitement python3 qui semble utilisable dans paiza
Utilisation de variables globales dans les fonctions python
[Python3] Définir dynamiquement des variables globales dans une fonction
mecab-python3 semble avoir besoin de unique-lite
[Mémorandum] Les clés japonaises ne peuvent pas être utilisées dans la chaîne de python.
compréhension de liste car operator.methodcaller ne peut pas être utilisé avec python 2.5
Operators ++, - ne peut pas être utilisé en python (différence de php)
[Redash] La bibliothèque standard ne peut pas être utilisée dans la fonction python
python> Est-il possible de faire des commentaires en ligne?> Il semble que ce soit sur plusieurs lignes
La vidéo ne peut pas être chargée avec Spyder dans l'environnement de développement Python
Erreur indiquant que le plugin Qt "cacao" ne peut pas être trouvé dans python-opencv
Scripts pouvant être utilisés lors de l'utilisation de Bottle en Python
Gérer les variables d'environnement en Python
Notez qu'il prend en charge Python 3
Un enregistrement que GAMEBOY n'a pas pu être fait avec Python. (PYBOY)
33 chaînes à ne pas utiliser comme noms de variables en python
Résumé de l'entrée standard de Python pouvant être utilisée dans Competition Pro
Jupyter Notebook 6.0.2 ne peut pas être installé dans l'environnement Python 2.7 créé dans Anaconda
TensorFlow / python> // grammaire> Cela semble être la division entière de python / En Python 2.X, décrire à partir de la division d'importation / division de plancher de __future__
Il n'y a pas de variables d'instance «privées» en Python qui ne sont accessibles qu'à partir d'un objet.
Initialisation de variables globales à l'aide de décorateurs Python
Les mines terrestres cachées dans les variables de classe Python
J'ai créé un bot Discord en Python qui se traduit quand il réagit
Le module ne peut pas être importé en Python sur EC2 exécuté à partir d'AWS Lambda
Correction d'un bug où node.surface ne pouvait pas être obtenu avec python3 + mecab