2015-12-22 10 views
13

Mam funkcję, która używa przetwarzania wieloprocesorowego (w szczególności joblib), aby przyspieszyć powolną procedurę za pomocą wielu rdzeni. Działa świetnie; bez pytań.Czy funkcje mogą być znane, jeśli są już w Pythonie (joblib) w trybie wieloprocesowym?

Mam zestaw testów, który wykorzystuje proces wieloprocesowy (obecnie tylko system wieloprocesorowy.), Ale można go zmienić na joblib), aby uruchomić niezależne funkcje testu każdego modułu. Działa świetnie; bez pytań.

Problem polega na tym, że teraz zintegrowałem funkcję przetwarzania wieloprocesowego z pakietem testów modułu, aby proces puli działał z funkcją wieloprocesową. Chciałbym sprawić, by wewnętrzna funkcja wiedziała, że ​​jest już wielokrotnie przetwarzana i nie rozpędza więcej widelców. Obecnie proces wewnętrzny czasami zawiesza się, ale nawet jeśli nie, oczywiście nie ma korzyści dla wieloprocesowości w ramach już równoległej rutyny.

Potrafię wymyślić kilka sposobów (z plikami blokad, ustawieniem jakiejś zmiennej globalnej itp.), Aby określić stan, w którym się znajdujemy, ale zastanawiam się, czy istnieje jakiś standardowy sposób na ustalenie tego (albo w trybie wieloprocesorowym PY lub w joblib). Jeśli działa tylko w PY3, byłoby dobrze, choć oczywiście rozwiązania, które działają również na poziomie 2.7 lub niższym, byłyby lepsze. Dzięki!

+0

Po miesiącu myśleć o tym, jak tylko będę pisał bounty, zorientowali się odpowiedź: ' multiprocessing.current_process(). daemon'. 50 przedstawicielowi tego, kto chce to napisać. :-) –

Odpowiedz

2

Odpowiedź na konkretne pytanie brzmi: nie znam gotowego narzędzia.

Minimalny (*) refaktoryzacja jądra będzie dodawaniem nazwanego parametru do funkcji, która obecnie tworzy procesy potomne. Domyślnym parametrem będzie twoje bieżące zachowanie, a inna wartość zostanie zmieniona na zachowanie zgodne z tym, w jaki sposób przeprowadzasz testy (**).

(*: mogą istnieć inne, mogą być lepsze, alternatywy projektowe do rozważenia, ale nie mamy wystarczających informacji) (**: można powiedzieć, że wprowadzenie zachowania warunkowego wymagałoby przetestowania tego również i jesteśmy z powrotem do punktu wyjścia ...)

2

równoległy joblib powinien móc sortować te rzeczy:
http://pydoc.net/Python/joblib/0.8.3-r1/joblib.parallel/

Dwa kawałki z 0.8.3-r1:

# Set an environment variable to avoid infinite loops 
os.environ[JOBLIB_SPAWNED_PROCESS] = '1' 

Nie wiem, dlaczego idą ze zmiennej odnoszącej się do środowiska, do środowiska. sama .. Ale jak widać. Ta funkcja jest już zaimplementowana w joblib.

# We can now allow subprocesses again 
os.environ.pop('__JOBLIB_SPAWNED_PARALLEL__', 0) 


Tutaj można wybrać inne wersje, jeśli to jest bardziej istotne:
http://pydoc.net/Python/joblib/0.8.3-r1/

+1

Dzięki. Chociaż wydaje się, że 'multiprocessing.current_process(). Daemon' zwróci True, jeśli jest to proces potomny niezależnie od tego, czy używamy joblib. –

Powiązane problemy