przypadku wszystkich wątków/procesów są rzeczywiście CPU-bound, należy uruchomić dowolną liczbę procesów jako rdzenie CPU raportów. Z powodu HyperThreading, każdy rdzeń fizycznego procesora może być w stanie przedstawić wiele rdzeni wirtualnych. Zadzwoń pod numer multiprocessing.cpu_count
, aby uzyskać liczbę wirtualnych rdzeni.
Jeśli tylko p z 1 waszych wątków CPU jest związany, można dostosować tę liczbę przez pomnożenie przez p. Na przykład, jeśli połowa procesów jest związana z procesorem (p = 0,5) i masz dwa procesory z 4 rdzeniami i 2 razy HyperThreading, powinieneś rozpocząć 0,5 * 2 * 4 * 2 = 8 procesów.
Jeśli proces będzie zbyt krótki, aplikacja będzie działać wolniej niż oczekiwano. Jeśli twoja aplikacja skaluje się idealnie i jest tylko związana z procesorem (to znaczy jest 10 razy szybsza po wykonaniu 10 razy większej ilości rdzeni), oznacza to, że prędkość jest wolniejsza w relacji. Na przykład, jeśli twój system wywoła 8 procesów, ale zainicjujesz tylko 4, wykorzystasz połowę mocy obliczeniowej i zajmiesz dwa razy więcej czasu. Zauważ, że w praktyce żadna aplikacja nie skaluje się idealnie, ale niektóre (ray tracing, kodowanie wideo) są całkiem blisko.
Jeśli masz zbyt wiele procesów, narzut zwiększa synchronizację. Jeśli Twój program ma niewielki wpływ na synchronizację, nie wpłynie to na ogólne środowisko uruchomieniowe, ale może sprawić, że inne programy będą działać wolniej niż te, o ile nie ustawisz swoich procesów na niższy priorytet. Nadmierna liczba procesów (powiedzmy 10000) jest w teorii dobra, jeśli twój system operacyjny ma dobry harmonogram. W praktyce praktycznie każda synchronizacja spowoduje, że obciążenie stanie się nie do zniesienia.
Jeśli nie jesteś pewien, czy aplikacja jest związany z CPU i/lub doskonale skalowanie, po prostu obserwować obciążenie systemu z różnych liczy wątku. Chcesz, aby obciążenie systemu było mniejsze niż 100%, lub dokładniej: uptime jako liczba rdzeni wirtualnych.
Dzięki za wspaniałą odpowiedź. Nie wiedziałem o tym wszystkim. Co jeśli w aplikacji jest trochę niezwiązanych z procesorem cpu części? Na przykład, wiele obliczeń procesora, ale potem wynik końcowy jest zapisywany do pliku lub bazy danych. Czy to oznacza, że powinienem stworzyć więcej procesów, ponieważ niektórzy muszą czekać na końcową sieć (bazę danych) lub zapisać na dysku (zapis pliku)? – Lostsoul
@ Lostsoul Ogólnie rzecz biorąc, tak, jeśli udział aktywności związanej z dyskiem jest znaczący. Jeśli piszesz krótki plik podsumowania (np. Zdjęcie po raytracingu skomplikowanej sceny), efekt ten jest znikomy.Jeśli aplikacja odczytuje i zapisuje wiele danych, należy rzeczywiście zwiększyć liczbę procesów. Zaktualizowano odpowiedź jednym akapitem: Jeśli nie jesteś pewien, wypróbuj go! – phihag
Wystarczy dodać do części obserwacyjnej: oczywiście chcesz uniknąć zwiększenia wykorzystania procesora ze względu na narzut synchronizacji. Podczas wykonywania eksperymentu należy zmierzyć zarówno obciążenie systemu, jak i przepustowość aplikacji. – millimoose