2014-10-17 9 views
21

Wykonuję projekt uczenia maszynowego w Pythonie, więc muszę równolegle przewidywać funkcję, której używam w moim programie.multiprocessing.dummy w Pythonie nie wykorzystuje 100% procesora

from multiprocessing.dummy import Pool 
from multiprocessing import cpu_count 


def multi_predict(X, predict, *args, **kwargs): 
    pool = Pool(cpu_count()) 
    results = pool.map(predict, X) 
    pool.close() 
    pool.join() 
    return results 

Problem polega na tym, że wszystkie moje procesory zostały załadowane tylko na 20-40% (w sumie jest to 100%). Używam metody wieloprocesowej.dummy, ponieważ mam problem z modułem wieloprocesowym w funkcji trawienia.

Odpowiedz

43

Podczas korzystania multiprocessing.dummy, używasz wątki, a nie procesy:

multiprocessing.dummy replikuje API multiprocessing ale ma więcej niż owinięcie wokół modułu threading.

To oznacza, że ​​użytkownik jest ograniczony przez Global Interpreter Lock (GIL) i tylko jeden wątek może wykonywać operacje związane z procesorem na raz. To powstrzyma cię od pełnego wykorzystania procesorów. Jeśli chcesz uzyskać pełny paralelizm we wszystkich dostępnych rdzeniach, musisz rozwiązać problem trawienia, który uderzasz pod numerem multiprocessing.Pool.

Zauważ, że multiprocessing.dummy może być nadal przydatny, jeśli praca, którą chcesz zrównoleglić, jest związana z IO lub używa rozszerzenia C, które uwalnia GIL. Jednak dla czystego kodu Pythona będziesz potrzebował multiprocessing.

+0

Lub użyj opartej na GIL implementacji Pythona, takiej jak Jython lub IronPython ... lub importuj wersję GHP-less STP PyPy z 2015 roku. :) – abarnert

+14

[Wątki Python są rzeczywistymi wątkami systemu operacyjnego: mogą działać równolegle (jeśli istnieją) są wieloma rdzeniami procesora). Tylko czysty kod Pythona jest ograniczony przez GIL. Rozszerzenia C, takie jak 'lxml',' regex', 'numpy' mogą i wypuszczają GIL, a zatem kilka wątków może i działa równolegle.] (Http://stackoverflow.com/questions/26234301/synchronise-muti-threads -w-python # comment41151656_26234761) – jfs

+0

@jfs Więc dlaczego nie działa dla OP? – endolith

Powiązane problemy