2012-02-13 13 views
6

Creo que estoy siguiendo correctamente la documentación de python, pero estoy teniendo problemas para obtener el resultado que estoy buscando. Básicamente, tengo una lista de números, que se pasan a una función de anidados para bucles y la salida se guarda en un diccionario.¿Cómo puedo acceder a un diccionario compartido con multiprocesamiento?

Aquí está el código:

from multiprocessing import Pool, Manager 

list = [1,2,3,10] 
dictionary = {} 
def test(x, dictionary): 
    for xx in range(100): 
     for xxx in range(100): 
      dictionary[x]=xx*xxx 



if __name__ == '__main__': 
    pool = Pool(processes=4) 
    mgr = Manager() 
    d = mgr.dict() 
    for N in list: 
     pool.apply_async(test, (N, d)) 

    # Mark pool as closed -- no more tasks can be added. 
    pool.close() 

    # Wait for tasks to exit 
    pool.join() 

    # Output results 
    print d 

Aquí está el resultado esperado:

{1: 9801, 2: 9801, 3: 9801, 10: 9801} 

Cualquier sugerencia de lo que estoy haciendo mal? Además, no me he convencido a mí mismo de que los recursos compartidos sean el mejor enfoque (pensando en usar una base de datos para mantener el estado) así que si mi enfoque es completamente erróneo o hay una mejor manera de hacerlo en Python, por favor avíseme.

Respuesta

3

cambiar la definición de test a:

def test(x, d): 
    for xx in range(100): 
     for xxx in range(100): 
      d[x]=xx*xxx 

De lo contrario Estás a incrementar algunos mundial dictionary (sin sincronización) y nunca acceder a ella más tarde.


En cuanto al enfoque general, creo que este en particular tiene mucha controversia en el diccionario compartido. ¿Tiene realmente tiene que actualizarlo de cada proceso tan pronto como eso? Acumular lotes de resultados parciales en cada proceso y simplemente actualizar el objeto compartido de vez en cuando debería tener un mejor rendimiento.

+0

Gracias, no puedo creer que haya cometido un error tan simple. Gracias. En cuanto al enfoque general. Mi código real básicamente necesita referirse a elementos dict existentes y si no existe para crearlo (y si existe para procesarlo dentro del nuevo bucle). Lotearlo no funcionaría específicamente para mí, pero es bueno saber acerca de ese enfoque. Estaba pensando en una base de datos (o almacenando los resultados en un archivo) pero no estaba seguro. – Lostsoul

Cuestiones relacionadas