2010-05-03 4 views
6

Sto provando a generare un uuid per un nome file, e sto anche usando il modulo multiprocessing. Spiacevolmente, tutti i miei uuids finiscono esattamente allo stesso modo. Ecco un piccolo esempio:Il multiprocessing di Python non funziona bene 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() 

Ho dato un'occhiata in codice di uuid.py, e sembra a seconda-on-the-piattaforma di utilizzare alcune routine a livello del sistema operativo per casualità, così sto perplesso da un pitone -level soluzione (per fare qualcosa come ricaricare il modulo uuid o scegliere un nuovo seme casuale). Potrei usare uuid.uuid1(), ma solo 8 cifre differiscono e penso che siano derivate esclusivamente dal tempo, il che sembra pericoloso soprattutto dato che io sono multiprocessing (quindi il codice potrebbe essere eseguito esattamente nello stesso momento) . C'è qualche saggezza là fuori su questo problema?

risposta

5

Questo è il modo corretto di generare il proprio uuid4, se hai bisogno di farlo:

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

Python dovrebbe fare questo automaticamente - questo codice è proprio fuori di uuid.uuid4, quando il nativo _uuid_generate_random non esiste. Ci deve essere qualcosa di sbagliato nella _uuid_generate_random della tua piattaforma.

Se si deve fare questo, non aggirare il problema da soli e lasciare che tutti gli altri sulla piattaforma soffrano; report the bug.

+0

Abbastanza sicuro, impostazione uuid._uuid_generate_random = Nessuno fa la cosa giusta. Deve essere un bug nella libc di Mac OS X uuid_generate_random(). Grazie per il suggerimento di presentare un bug report: http://bugs.python.org/issue8621 – yig

+0

Ho anche presentato un bug di piattaforma contro Mac OS X: http://openradar.appspot.com/radar?id=334401 – yig

0

Non vedo un modo per fare questo lavoro. Ma potresti semplicemente generare tutti gli uuids nel thread principale e passarli agli operai.

0

Questo funziona per me. La tua installazione Python ha os.urandom? In caso contrario, il seeding numerico casuale sarà molto scarso e porterebbe a questo problema (supponendo che non ci sia anche un modulo UUID nativo, uuid._uuid_generate_random).

+0

Questo è su Mac OS X (10.6.3, se è importante). Ho provato e funziona bene sulla mia macchina Ubuntu. Entrambi hanno os.urandom. – yig