2010-05-05 20 views
5

Estoy usando ParallelPython para desarrollar un script crítico para el rendimiento. Me gustaría compartir un valor entre los 8 procesos que se ejecutan en el sistema. Disculpe el ejemplo trivial, pero esto ilustra mi pregunta.Valor compartido en python paralelo

def findMin(listOfElements): 
    for el in listOfElements: 
     if el < min: 
      min = el 

import pp 
min = 0 
myList = range(100000) 
job_server = pp.Server() 
f1 = job_server.submit(findMin, myList[0:25000]) 
f2 = job_server.submit(findMin, myList[25000:50000]) 
f3 = job_server.submit(findMin, myList[50000:75000]) 
f4 = job_server.submit(findMin, myList[75000:100000]) 

Los documentos PP no parecen describir una forma de compartir datos entre procesos. ¿Es posible?

Si es así, ¿hay un mecanismo de bloqueo estándar (como en el módulo de subprocesamiento) para confirmar que solo se realiza una actualización a la vez?

l = Lock() 
if(el < min): 
    l.acquire 
    if(el < min): 
     min = el 
    l.release 

entiendo que podía mantener un mínimo local y comparar el 4 en el hilo principal, una vez vuelto, pero compartiendo el valor que pueda hacer algunos mejores poda de mi árbol binario BFS y potencialmente ahorrar una gran cantidad de iteraciones del bucle .

de Acción de Gracias

Jonathan

Respuesta

1

En realidad, hay un ejemplo en http://www.parallelpython.com/content/view/17/31/#CALLBACK y simplemente utilizan los bloqueos del módulo de hilo.

Al igual que JudoWill señaló, asegúrese de experimentar con qué frecuencia debe sincronizar el mínimo global en sus trabajos. Si lo hace cada vez, puede terminar cerca de la serialización de su cálculo completo.

0

No estoy seguro sobre el módulo PP, pero siempre se puede almacenar el valor más bajo en un archivo de trabajo. Mi única preocupación sería que pasaras la mayor parte de tu tiempo adquiriendo y soltando el candado. La única excepción sería si su operación el < min lleva mucho tiempo.

Diría que su técnica de "fusión" probablemente sea el camino a seguir.

Y, por cierto, entiendo que está dando un ejemplo simple de su código para abreviar, pero no use min como un nombre de variable ... le causará muchos dolores de cabeza durante la depuración.

0

No guardará ninguna iteración al compartir el valor, debe leer al menos una vez cada elemento de la lista. Además, será más lento, ya que debe bloquear cada vez que use el valor compartido.

En su caso, si desea más rendimiento, debe calcular un mínimo para cada parte por separado y comparar estos resultados en el hilo principal.

Por otro lado, pasar la lista a otros procesos puede ser consumir más recursos que encontrar el valor mínimo de la lista en una sola pasada.

1

Parallel Python ejecuta las subfunciones en diferentes procesos, por lo que no hay memoria compartida, lo que significa que no debe utilizar un valor compartido. El ejemplo de devolución de llamada mencionado por clackle toma los resultados de cada función y los combina en una función de devolución de llamada que está funcionando en el proceso original. Para usarlo apropiadamente deberías hacer algo similar; en el ejemplo dado, usted calcularía los mínimos locales y usaría una función de devolución de llamada para encontrar el mínimo de todos los subresultados. Espero que en tu caso real puedas hacer algo similar.

Cuestiones relacionadas