„Czy procesy potomne powstały w wyniku współdzielonych obiektów wieloprocesowych utworzonych wcześniej w programie?”
Nie (python przed 3.8) i tak w 3.8 ( https://docs.python.org/3/library/multiprocessing.shared_memory.html#module-multiprocessing.shared_memory )
Procesy mają niezależną przestrzeń pamięci.
Rozwiązanie 1
Aby jak najlepiej wykorzystać dużą strukturę z dużą liczbą pracowników, zrób to.
Zapisz każdego pracownika jako „filtr” - odczytuje wyniki pośrednie ze standardowego wejścia, działa, zapisuje wyniki pośrednie na standardowe wyjście.
Połącz wszystkich pracowników jako rurociąg:
process1 <source | process2 | process3 | ... | processn >result
Każdy proces czyta, pracuje i pisze.
Jest to niezwykle wydajne, ponieważ wszystkie procesy działają jednocześnie. Zapisy i odczyty przechodzą bezpośrednio przez bufory współdzielone między procesami.
Rozwiązanie 2
W niektórych przypadkach masz bardziej złożoną strukturę - często strukturę „rozłożoną”. W takim przypadku masz rodzica z kilkoma dziećmi.
Rodzic otwiera dane źródłowe. Rodzic rozwidla wiele dzieci.
Rodzic czyta źródło, wypuszcza części źródła do każdego współbieżnie działającego dziecka.
Kiedy rodzic dojdzie do końca, zamknij rurkę. Dziecko otrzymuje koniec pliku i kończy normalnie.
Części dziecięce są przyjemne w pisaniu, ponieważ każde dziecko po prostu czyta sys.stdin
.
Rodzic ma trochę wymyślnej pracy nóg przy odradzaniu wszystkich dzieci i prawidłowym utrzymywaniu rur, ale nie jest tak źle.
Fan-in to odwrotna konstrukcja. Wiele niezależnie działających procesów musi przeplatać swoje dane wejściowe do wspólnego procesu. Kolektor nie jest tak łatwy do napisania, ponieważ musi czytać z wielu źródeł.
Czytanie z wielu nazwanych potoków jest często wykonywane za pomocą select
modułu, aby zobaczyć, które potoki mają oczekujące dane wejściowe.
Rozwiązanie 3
Wspólne wyszukiwanie to definicja bazy danych.
Rozwiązanie 3A - załaduj bazę danych. Pozwól pracownikom przetwarzać dane w bazie danych.
Rozwiązanie 3B - utwórz bardzo prosty serwer przy użyciu werkzeug (lub podobnego), aby zapewnić aplikacje WSGI, które odpowiadają na HTTP GET, aby pracownicy mogli wysyłać zapytania do serwera.
Rozwiązanie 4
Współdzielony obiekt systemu plików. Unix OS oferuje współdzielone obiekty pamięci. Są to tylko pliki, które są mapowane do pamięci, dzięki czemu zamiana we / wy jest wykonywana zamiast bardziej konwencjonalnych odczytów buforowanych.
Możesz to zrobić z kontekstu Pythona na kilka sposobów
Napisz program startowy, który (1) rozbija twój oryginalny gigantyczny obiekt na mniejsze obiekty i (2) uruchamia pracowników, każdy z mniejszym obiektem. Mniejsze obiekty mogą być piklowanymi obiektami Pythona, aby zaoszczędzić trochę czasu na odczyt plików.
Napisz program startowy, który (1) czyta twój oryginalny gigantyczny obiekt i zapisuje plik ze strukturą strony, zakodowany bajtowo, używając seek
operacji, aby zapewnić, że poszczególne sekcje są łatwe do znalezienia za pomocą prostych wyszukiwań. To właśnie robi silnik bazy danych - dzieli dane na strony, ułatwiając zlokalizowanie każdej strony za pomocą pliku seek
.
Przywołaj pracowników mających dostęp do tego dużego pliku o strukturze strony. Każdy pracownik może szukać odpowiednich części i tam wykonywać swoją pracę.
marshal.load
rodzica i każde dziecko (każdy proces importuje moduł).