2015-06-02 18 views
7

Ho un'applicazione python che utilizza un dizionario come una memoria condivisa tra più processi:Gunicorn memoria condivisa tra i processi di multiprocessing e lavoratori

from multiprocessing import Manager 
manager = Manager() 
shared_dict = manager.dict() 

REST API è implementato utilizzando Flask. Durante l'uso di pywsgi o semplicemente di Flask.run per inizializzare il server Flask, tutto andava bene. Ho deciso di gettare nel mix gunicorn. Ora, quando accedo questo dict condiviso da uno qualsiasi dei lavoratori (anche se solo uno è in esecuzione) ottengo l'errore:

message = connection.recv_bytes(256) # reject large message
IOError: [Errno 35] Resource temporarily unavailable

ho cercato in mmap, multiprocessing Listener e Client e sembravano tutti come un un sacco di spese generali.

risposta

0

Non so l'errore specifico, ma penso che la causa più probabile è che quando si aggiunge il server Web, i processi vengono inizializzati su richiesta, quindi lo manager_dict viene perso all'interno delle chiamate. Se il dict non è abbastanza grande e si può pagare la penalità di serializzazione/de-serializzazione, usare l'archivio della struttura dati in memoria redis con la libreria py-redis è piuttosto semplice.

Problemi correlati