Pregunta

El siguiente código no parece funcionar correctamente para mí. Se requiere iniciar un ppserver en otro equipo de la red, por ejemplo, con el comando siguiente:

ppserver.py -r -a -w 4

Una vez que se ha iniciado este servidor, en mi máquina corro este código:

import pp
import time
job_server = pp.Server(ppservers = ("*",))
job_server.set_ncpus(0)
def addOneBillion(x):
    r = x
    for i in xrange(10**9):
        r+=1
    f = open('/home/tomb/statusfile.txt', 'a')
    f.write('finished at '+time.asctime()+' for job with input '+str(x)+'\n')
    return r

jobs = []
jobs.append(job_server.submit(addOneBillion, (1,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (2,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (3,), (), ("time",)))

for job in jobs:
    print job()
print 'done'

La parte extraña: Mirando la /home/tomb/statusfile.txt, puedo ver que se está haciendo escrito varias veces, como si la función se ejecuta varias veces. He observado esto continua durante más de una hora antes, y nunca he visto un retorno job().

Odder: Si cambio el número de iteraciones en la definición TestFunc a 10 ** 8, la función se ejecuta solo una vez, y devuelve un resultado como se esperaba!

Parece que algún tipo de condición de carrera? Simplemente usando núcleos locales obras excelentes. Esto es con pp v 1.6.0 y 1.5.7.

Actualización: Alrededor de 775 millones: consigo resultados inconsistentes:. Dos puestos de trabajo se repiten una vez, en los acabados de primera vez

semana después Actualización: He escrito mi propio módulo de procesamiento paralelo de evitar esto, y evitará pitón paralelo en el futuro, a menos que alguien cifras esto - Voy a moverse a mirarlo algo de buceo más (en realidad en el código fuente) en algún momento.

Meses después actualizar: No restante resentimientos, paralelo Python. Tengo la intención de volver tan pronto como tenga tiempo para migrar mi solicitud. Edición de títulos para reflejar solución.

¿Fue útil?

Solución

Respuesta de Bagira del foro paralelo Python:

  

¿Cuánto tiempo hace el cálculo de cada   toma trabajo? Echar un vistazo a la variable   TRANSPORT_SOCKET_TIMEOUT en   /usr/local/lib/python2.6/dist-packages/pptransport.py.

     

Tal vez su trabajo toma más tiempo que el   tiempo en la variable anteriormente. Incrementar   el valor de la misma y tratar.

Resulta que este era exactamente el problema. En mi aplicación que estoy usando PP como un planificador lote de puestos de trabajo que puede durar varios minutos, por lo que necesito para ajustar esto. (El valor predeterminado era 30s)

Otros consejos

Puede ser que la biblioteca permite duplicados ya que algunos nodos quedan atrás habrá una larga cola de tareas para completar restante. Mediante la duplicación de las tareas, se puede pasar por alto los nodos lentos y se debe tomar sólo el resultado de que termine primero. Usted puede evitar esto mediante la inclusión de un identificador único para cada tarea y aceptar sólo el primero que volver para cada uno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top