Program, który tworzy kilka procesów, które działają w kolejce, którą Q
można połączyć , i może ostatecznie manipulować słownikiem globalnym w D
celu przechowywania wyników. (aby każdy proces podrzędny mógł D
przechowywać swój wynik, a także zobaczyć, jakie wyniki wytwarzają inne procesy podrzędne)
Jeśli drukuję słownik D w procesie potomnym, widzę modyfikacje, które zostały w nim wykonane (tj. Na D). Ale gdy główny proces dołącza do Q, jeśli drukuję D, jest to pusty dykt!
Rozumiem, że jest to problem z synchronizacją / blokadą. Czy ktoś może mi powiedzieć, co się tutaj dzieje i jak mogę zsynchronizować dostęp do D?
Odpowiedzi:
Ogólna odpowiedź dotyczy użycia
Manager
przedmiotu. Na podstawie dokumentacji:Wynik:
źródło
multiprocessing.Manager()
zwraca instancjęSyncManager
, której nazwa sugeruje tyle!Manager
ale nadal nie mam szczęścia. Czy mógłbyś spojrzeć na moje pytanie tutaj i sprawdzić, czy możesz zaoferować rozwiązanie? Nadal mogę uzyskać różne liczby losowe, jeśli robię to zanp.random.seed(None)
każdym razem, gdy generuję liczbę losową, ale nie pozwala mi to na użycie losowego stanu procesu nadrzędnego, czego nie chcę. Każda pomoc jest mile widziana.wieloprocesorowość to nie wątkowanie. Każdy proces potomny otrzyma kopię pamięci procesu głównego. Ogólnie stan jest udostępniany za pośrednictwem komunikacji (potoki / gniazda), sygnałów lub pamięci współdzielonej.
Wieloprocesowość udostępnia pewne abstrakcje dla twojego przypadku użycia - stan współdzielony, który jest traktowany jako lokalny przez użycie serwerów proxy lub pamięci współdzielonej: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes
Odpowiednie sekcje:
źródło
Chciałbym podzielić się własną pracą, która jest szybsza niż dykt Manager i jest prostsza i bardziej stabilna niż biblioteka pyshmht, która zużywa mnóstwo pamięci i nie działa w systemie Mac OS. Chociaż mój dykt działa tylko dla zwykłych strun i jest obecnie niezmienny. Używam implementacji sondowania liniowego i przechowuję klucze i pary wartości w oddzielnym bloku pamięci po tabeli.
Wyniki wydajności mojego laptopa to:
prosty przykład użycia:
źródło
Oprócz @ senderle tutaj, niektórzy mogą również zastanawiać się, jak korzystać z funkcjonalności
multiprocessing.Pool
.Fajną rzeczą jest to, że
.Pool()
wmanager
instancji istnieje metoda, która naśladuje wszystkie znane API najwyższego poziomumultiprocessing
.Wynik:
To jest nieco inny przykład, w którym każdy proces po prostu rejestruje swój identyfikator procesu w
DictProxy
obiekcie globalnymd
.źródło
Może możesz spróbować pyshmht , współdzielenie rozszerzenia tablicy mieszania opartego na pamięci dla Pythona.
Ogłoszenie
Nie jest w pełni przetestowany, tylko w celach informacyjnych.
Obecnie brakuje mu mechanizmów blokowania / sem do przetwarzania wieloprocesowego.
źródło