2010-05-03 27 views
6

Estoy intentando generar un uuid para un nombre de archivo, y también estoy usando el módulo de multiprocesamiento. Desagradablemente, todos mis elementos terminan exactamente igual. He aquí un pequeño ejemplo:El multiproceso de Python no funciona muy bien con uuid.uuid4()

import multiprocessing 
import uuid 

def get_uuid(a): 
    ## Doesn't help to cycle through a bunch. 
    #for i in xrange(10): uuid.uuid4() 

    ## Doesn't help to reload the module. 
    #reload(uuid) 

    ## Doesn't help to load it at the last minute. 
    ## (I simultaneously comment out the module-level import). 
    #import uuid 

    ## uuid1() does work, but it differs only in the first 8 characters and includes identifying information about the computer. 
    #return uuid.uuid1() 

    return uuid.uuid4() 

def main(): 
    pool = multiprocessing.Pool(20) 
    uuids = pool.map(get_uuid, range(20)) 
    for id in uuids: print id 

if __name__ == '__main__': main() 

Me asomé en el código de uuid.py, y parece que dependiendo-on-the-plataforma de utilizar algunas rutinas de nivel de sistema operativo para la aleatoriedad, así que estoy perplejo en cuanto a una pitón solución de nivel (para hacer algo como volver a cargar el módulo uuid o elegir una nueva semilla aleatoria). Podría usar uuid.uuid1(), pero solo 8 dígitos son diferentes y creo que se derivan exclusivamente del tiempo, lo que parece peligroso, especialmente dado que tengo multiprocesamiento (por lo que el código podría estar ejecutándose exactamente al mismo tiempo) . ¿Hay alguna Sabiduría sobre este tema?

Respuesta

5

Esta es la forma correcta para generar su propia uuid4, si usted tiene que hacer lo siguiente:

import os, uuid 
return uuid.UUID(bytes=os.urandom(16), version=4) 

Python debería estar haciendo esto de forma automática - el código es correcto de uuid.uuid4, cuando el nativo _uuid_generate_random no existe. Debe haber algo mal con _uuid_generate_random de su plataforma.

Si tiene que hacer esto, no solo trabaje por su cuenta y deje que todos los demás en su plataforma sufran; report the bug.

+0

Efectivamente, establecer uuid._uuid_generate_random = None hace lo correcto. Debe ser un error en libc uuid_generate_random() de Mac OS X. Gracias por la sugerencia de presentar un informe de error: http://bugs.python.org/issue8621 – yig

+0

También archivé un error de plataforma contra Mac OS X: http://openradar.appspot.com/radar?id=334401 – yig

0

No veo la manera de hacer que esto funcione tampoco. Pero puedes generar todos los elementos en el hilo principal y pasarlos a los trabajadores.

0

Esto funciona bien para mí. ¿Su instalación de Python tiene os.urandom? De lo contrario, la distribución de números aleatorios será muy pobre y podría conducir a este problema (suponiendo que tampoco exista un módulo UUID nativo, uuid._uuid_generate_random).

+0

Esto está en Mac OS X (10.6.3, si es importante). Probé y funciona bien en mi máquina Ubuntu. Ambos tienen os.urandom. – yig

Cuestiones relacionadas