[FIXED] Wie verwende ich multprocessing.Value (oder andere gemeinsam genutzte Ressourcen) auf dem Mac mit Spawn?

Ausgabe

Beispiel:

import multiprocessing as mp

counter = mp.Value('i', 0)

def test_fun(i):
    global counter
    with counter.get_lock():
        counter.value += 1

def main():
    global counter
    with mp.Pool(4) as p:
        result = p.map(test_fun, range(4))
    print(counter.value)

if __name__ == "__main__":
    main()

Die erwartete Ausgabe ist 4, da der Wert geteilt wird, aber auf dem Mac 0 ausgibt.

Es funktioniert unter Linux oder unter Verwendung, forkaber ich möchte, dass es mit Spawn funktioniert.

Lösung

Verschieben Sie einfach die Counter-Deklaration in Ihre Hauptfunktion und legen Sie sie dann als globale Variable innerhalb des Kinder-Initialisierers fest, genauso wie es unter Windows gemacht wird.

import multiprocessing as mp

def setup_fn(value):
    global counter
    counter = value

def test_fun(i):
    global counter
    with counter.get_lock():
        counter.value += 1

def main():
    counter = mp.Value('i', 0)
    with mp.Pool(4, initializer=setup_fn, initargs=(counter,)) as p:
        result = p.map(test_fun, range(4))
    print(counter.value)

if __name__ == "__main__":
    main()


Beantwortet von –
Ahmed AEK


Antwort geprüft von –
Dawn Plyler (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like