[Python] Es scheint, dass globale Variablen in Multiprocessing nicht referenziert werden können

Ich hatte keinen Bericht darüber, also werde ich eine Nachricht hinterlassen.

In Python können Sie mit dem Standardmodul Multiprocessing parallele Berechnungen durchführen. Hardware-Parallelberechnung wie GPU wird nicht unterstützt, es handelt sich lediglich um eine Multiprozessverarbeitung auf der CPU.

Die Elemente der Liste der gepoolten Argumente werden an die Argumente der Funktion übergeben, die Sie parallel verarbeiten möchten.

Wenn Sie ein Skript schreiben, das auf globale Variablen in einer parallel verarbeiteten Funktion verweist, sieht es wie folgt aus.

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))

Ergebnis 2017-03-14_150753.jpg Wie Sie sehen, können Sie auf eine normale Funktion (init_global) verweisen und diese zuweisen, aber Sie können nicht auf eine globale Variable in einer Funktion verweisen, die parallel verarbeitet wird.


Wenn Sie wirklich auf den Wert der globalen Variablen in der Parallelverarbeitungsfunktion verweisen möchten, müssen Sie anscheinend das Argument des Aufrufers angeben. (Wenn Sie mehrere Argumente übergeben möchten, müssen Sie einen Taple generieren.)

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))

Ergebnis 2017-03-14_151709.jpg Ich konnte es übergeben.

Möglicherweise gibt es eine geeignete Methode, aber ich konnte sie nicht finden. Bitte melden Sie, ob es eine bessere Methode gibt.

Recommended Posts

[Python] Es scheint, dass globale Variablen in Multiprocessing nicht referenziert werden können
Python3-Verarbeitung, die in Paiza verwendbar zu sein scheint
Verwendung globaler Variablen in Python-Funktionen
[Python3] Definieren Sie globale Variablen in einer Funktion dynamisch
mecab-python3 scheint unique-lite zu benötigen
[Memorandum] Japanische Schlüssel können nicht in Pythons string.Template.substitute verwendet werden
Listenverständnis, da operator.methodcaller nicht mit Python 2.5 verwendet werden kann
Operatoren ++, - können nicht in Python verwendet werden (Unterschied zu PHP)
[Redash] Die Standardbibliothek kann nicht in der Python-Funktion verwendet werden
Python> Ist es möglich, Inline-Kommentare abzugeben?> Es scheint, dass es sich um mehrere Zeilen handeln muss
Videos können in der Python-Entwicklungsumgebung nicht mit Spyder geladen werden
Fehler, dass das Qt-Plugin "cocoa" in python-opencv nicht gefunden werden kann
Skripte, die bei der Verwendung von Bottle in Python verwendet werden können
Behandeln Sie Umgebungsvariablen in Python
Beachten Sie, dass es Python 3 unterstützt
Ein Datensatz, den GAMEBOY mit Python nicht erstellen konnte. (PYBOY)
33 Zeichenfolgen, die in Python nicht als Variablennamen verwendet werden sollten
Zusammenfassung der Standardeingabe von Python, die in Competition Pro verwendet werden kann
Jupyter Notebook 6.0.2 kann nicht in der in Anaconda erstellten Python 2.7-Umgebung installiert werden
TensorFlow / python> // grammar> Es scheint sich um die Ganzzahldivision von Python zu handeln
In Python gibt es keine "privaten" Instanzvariablen, auf die nur innerhalb eines Objekts zugegriffen werden kann.
Initialisierung globaler Variablen mit Python-Dekoratoren
In Python-Klassenvariablen versteckte Landminen
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
Das Modul kann nicht in Python auf EC2 importiert werden, das von AWS Lambda ausgeführt wird
Es wurde ein Fehler behoben, bei dem node.surface mit python3 + mecab nicht abgerufen werden konnte