Python używa tylko jednego rdzenia do pracy?

13

Ostatnio zauważyłem, że Python używa tylko jednego rdzenia na raz. Czy istnieje sposób, może specjalne kompilacje lub polecenia, aby wykorzystywał wszystkie zasoby (drugi rdzeń)?

mahmoud hageer
źródło
1
Jeśli uruchamiasz proces wsadowy dla powtarzających się zadań, a skrypt działa poprawnie i wykorzystuje 100% jednego rdzenia do robienia czegoś pożytecznego, może nie być tak niebezpieczny. Rozpocznij drugi proces, który uruchamia drugi rdzeń również na 100%. Efekt brutto może być lepszy niż w przypadku jednego procesu gwintowanego. Sytuacja jest inna, jeśli masz do wykonania tylko jedno ciężkie zadanie.
user30184,
To już jest omawiane Zobacz ten wątek, aby uzyskać więcej informacji i rozwiązań gis.stackexchange.com/questions/55048/…
iRfAn
Czy byłbyś w stanie edytować swoje pytanie, aby wyjaśnić, czy chodzi o Python ogólnie, czy bardziej szczegółowo ArcPy (o czym wspominają tagi)? Jeśli tak, czy możesz podać jakieś szczegóły, aby wykazać, że tak jest, tj. Jak to zauważyłeś?
PolyGeo

Odpowiedzi:

15

Możesz użyć podprocesów, aby skorzystać z wielu rdzeni w skrypcie Python, dzięki czemu kilka zadań może działać równolegle. Ale nie można podzielić jednego zadania na kilka rdzeni. Zobacz szczegółowe wyjaśnienie w tym FAQ: Czy ArcGIS 10 obsługuje procesory wielordzeniowe i / lub 64-bitowe systemy operacyjne?

Jeśli jesteś wytrawnym użytkownikiem Pythona, możesz zainteresować się podejściem wyjaśnionym w tej prezentacji użytkownika z Dev Summit 2014, o nazwie Równoległe geoprzetwarzanie z wykorzystaniem Python Multiprocessing and Critical Path Methodology , jednak nie pozwoli ci to na użycie kilku rdzeni dla to samo zadanie.

W przeciwnym razie będziesz musiał poczekać na wydanie ArcGIS Pro (aplikacja w pełni 64-bitowa) w tym roku, aby sprawdzić, jak działa wielowątkowość ... (lub wypróbuj wersję beta teraz)

GISGe
źródło
4

Jak niektórzy wspomnieli, w ArcGIS Desktop nie ma obsługi wieloprzetwarzania. Mówiąc o przetwarzaniu zestawów danych GIS w środowisku komputerowym, próbuję dowiedzieć się, czy mogę podzielić duży przepływ pracy na mniejsze fragmenty, które zostaną obliczone w tym samym czasie, ładując wiele rdzeni. Prawie każdy przypadek powinien zostać zbadany indywidualnie, ponieważ zachowania narzędzi GP mogą się znacznie różnić.

Zastanów się, co można zrobić szybciej, rozwiązując prosty problem matematyczny. Jaki jest najszybszy sposób na policzenie wszystkich liczb od 1 do 100?

1) poprzez zsumowanie wyników jeden po drugim i dodawanie do siebie sumy przyrostowo (1 + 2 = 3, 3 + 3 = 6,6 + 4 = 10 i tak dalej). Jeden rdzeń pracuje nad tym zadaniem.

2) wcześniej podziel wartości na poszczególne części i najpierw zsumuj wartości (od 1 do 30, 31 do 60 i 60 do 100). Trzy rdzenie będą działać jednocześnie (ostatnim krokiem byłoby zsumowanie trzech otrzymanych wartości).

Ponieważ różne narzędzia GP są implementacjami różnych algorytmów z różną notacją big-O , prawdopodobnie będziesz musiał podejść do nich inaczej pod względem przesyłania wielu procesów.

Dobrym punktem wyjścia byłoby poznanie działania biblioteki wieloprocesowej w Pythonie. Używam dość mocno.

Zauważyłem również, że uruchamianie skryptów Pythona z wiersza polecenia przy użyciu 64-bitowego języka Python zwykle powoduje szybsze działanie (w porównaniu z uruchomieniem IDE, ale może nie być tak na twoim komputerze). Geoprzetwarzanie w tle zostało wprowadzone w 10.1, ale spróbuj uruchomić skrypty Pythona w 64-bitowym języku Python i zobacz, jak wpływa to na wydajność.

ArcGIS Pro wymieniony w innej odpowiedzi jest dostępny w wersji beta 5 do pobrania (pamiętaj, że aby zgłosić wszelkie błędy i mieć dostęp do konta ArcGIS Online dla Organizacji, musisz być uczestnikiem społeczności Esri Beta , aby móc uruchom Pro).

Alex Tereshenkov
źródło
1

Pypy to zgodna wersja Pythona, która działa 4-5 razy szybciej niż CPython („standardowy” python).

Jeśli masz dość odwagi, aby zbudować go ze źródła, istnieje gałąź, która „może równolegle uruchamiać wiele niezależnych wątków wymagających CPU.” Oznacza to, że zyskujesz zalety wielowątkowości bez konieczności ponownego pisania kodu.

sbell
źródło
0

Prosta odpowiedź to nie. To zależy od lepszej odpowiedzi.

Ze względu na implementację CPython (najczęściej używanego Pythona) można bezpiecznie założyć, że Twój Python nie może faktycznie korzystać z wielowątkowości. Widzieć:

http://en.wikipedia.org/wiki/Global_Interpreter_Lock

https://wiki.python.org/moin/GlobalInterpreterLock

Zauważ, że IO jest odporny na GIL.

Teraz możesz nad tym popracować. Jak zauważyli inni, możesz odradzać podprocesy, a biblioteka wieloprocesowa może ci pomóc.

sprzedam miecz
źródło
1
We / wy jest odporny, ale tak samo wywołuje większość funkcji zaimplementowanych w C, w tym większość narzędzi GP i wszystko w numpy. GIL jest mniejszym ograniczeniem w praktycznych środowiskach GIS niż mogłoby się wydawać.
Jason Scheirer,
0

Nie mogę rozwiązać problemów ArcGIS, ale jeśli chodzi o przetwarzanie wielu zadań za pomocą Pythona, czy zastanawiałeś się nad menedżerem zadań takim jak Celery (celeryproject.org)? Wymagałoby to zidentyfikowania różnych zadań przetwarzania, przekazania ich do „menedżera” w celu dystrybucji, uruchomienia „pracowników” otrzymujących zadania od menedżera, przetworzenia ich i przedstawienia wyników.

Nie jest to łatwe do wdrożenia, ale ma niewiarygodną elastyczność i pozwala w pełni wykorzystać możliwości przetwarzania (tj. Użyć tych wolnych rdzeni).

KenH
źródło