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?
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
También archivé un error de plataforma contra Mac OS X: http://openradar.appspot.com/radar?id=334401 – yig