2012-03-05 16 views
7

Desidero condividere piccole informazioni tra i miei nodi di lavoro (ad esempio, token di autorizzazione memorizzati nella cache, statistiche, ...) nel sedano.Condividere aree di memoria tra operatori di sedano su una macchina

Se creo un file globale all'interno del mio task, è univoco per worker (I miei worker sono processi e hanno una durata di 1 task/esecuzione).

Qual è la migliore pratica? Devo salvare lo stato esternamente (DB), creare una memoria condivisa vecchio stile (potrebbe essere difficile a causa delle diverse implementazioni del pool in sedano)?

Grazie in anticipo!

+1

Che dire di cache come memcached o negozi di valore-chiave come Redis? – demalexx

+0

Sarebbe un modo, ma speravo di trovare un modo senza un'ulteriore dipendenza. – Gregor

+0

È una dipendenza minuscola ma risolverà alcuni problemi che potresti incontrare nell'implementare la propria comunicazione tra processi. – demalexx

risposta

7

ho finalmente trovato una discreta soluzione - nucleo python multiprocessing-Responsabile:

from multiprocessing import Manager 
manag = Manager() 
serviceLock = manag.Lock() 
serviceStatusDict = manag.dict() 

Questo dict si può accedere da ogni processo, è sincronizzati, ma è necessario utilizzare un blocco quando accedervi contemporaneamente (come in ogni altra implementazione della memoria condivisa).

+0

Ciao Gregor, sarei felice di avere la tua opinione su questo problema che sto affrontando: http://stackoverflow.com/questions/26088868/asynchronous-task-queue-processing-of-in-memory-data- stucture-in-django Pensi che la tua soluzione sarebbe adatta per il mio problema lì? Grazie mille – cyberjoac

+0

Ciao cyberjoac, in generale questo potrebbe funzionare, ma è necessario provare se Django e Celery vivono nello stesso gruppo di processi (che dubito). Fammi sapere se funziona, sono interessato! – Gregor

+1

Dove si avvia questo Manager? –