2015-12-22 8 views
13

Ho una funzione che utilizza la multiprocessing (in particolare joblib) per accelerare una routine lenta usando più core. Funziona alla grande; nessuna domanda lì.Le funzioni possono sapere se sono già multiprocessi in Python (joblib)

Ho una suite di test che usa il multiprocessing (attualmente solo il sistema multiprocessing.Pool(), ma può cambiarlo in joblib) per eseguire indipendentemente le funzioni di test di ogni modulo. Funziona alla grande; nessuna domanda lì.

Il problema è che ora ho integrato la funzione di multiprocessing nella suite di test del modulo, in modo che il processo di pool esegua la funzione di multiprocessing. Mi piacerebbe farlo in modo che la funzione interiore sappia che è già multiprocesso e non gira più forchette di se stesso. Attualmente il processo interno a volte si blocca, ma anche se così non fosse, ovviamente non ci sono guadagni per il multiprocessing all'interno di una routine già parallela.

Posso pensare a diversi modi (con i file di blocco, impostare una sorta di variabile globale, ecc.) Per determinare lo stato in cui ci troviamo, ma mi chiedo se ci sia un modo standard per capirlo (in PY multiprocessing o in joblib). Se funziona solo in PY3, andrebbe bene, anche se ovviamente le soluzioni che funzionano anche su 2.7 o inferiori sarebbero migliori. Grazie!

+0

Dopo un mese di pensarci, non appena ho postato la bontà, ho capito la risposta: ' multiprocessing.current_process(). daemon'. 50 rappresentanti a chiunque voglia scriverlo. :-) –

risposta

2

La risposta alla domanda specifica è: non so di un'utilità pronta.

Un minimo (*) core refactoring dovrebbe aggiungere un parametro denominato alla funzione che attualmente sta creando processi figlio. Il parametro predefinito sarebbe il tuo comportamento corrente e un altro valore passerebbe a un comportamento compatibile con il modo in cui esegui i test (**).

(*: potrebbe esserci altro, potrebbe essere migliore, progettare alternative da considerare ma non abbiamo abbastanza informazioni , e siamo di nuovo al punto di partenza ...)

2

parallelo in joblib dovrebbe essere in grado di risolvere queste cose:
http://pydoc.net/Python/joblib/0.8.3-r1/joblib.parallel/

Due pezzi da 0.8.3-r1:

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

Non so perché vanno da una variabile che si riferisce all'ambiente, all'env. stesso .. Ma come puoi vedere. La funzione è già implementata in joblib.

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


Qui è possibile selezionare altre versioni, se questo è più rilevante:
http://pydoc.net/Python/joblib/0.8.3-r1/

+1

Grazie. Anche se sembra che 'multiprocessing.current_process(). Daemon' restituirà True se è un processo generato indipendentemente dal fatto che stiamo usando joblib o meno. –

Problemi correlati