2010-05-03 15 views
6

Próbuję wygenerować plik uuid dla nazwy pliku, a także korzystam z modułu do przetwarzania wieloprocesowego. Nieprzyjemnie, wszystkie moje uuidy kończą się dokładnie tak samo. Oto mały przykład:Wieloprocesorowość w Pythonie nie jest ładnie odtwarzana za pomocą 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() 

Zajrzałem do kodu uuid.py, a wydaje się, że w zależności od-on-the-platformie korzystać z niektórych procedur OS poziomie do przypadkowości, więc jestem zakłopotany, aby pytona -level rozwiązanie (zrobić coś jak przeładowanie modułu uuid lub wybrać nowy losowy materiał siewny). Mógłbym użyć uuid.uuid1(), ale tylko 8 cyfr różni się i myślę, że pochodzą one wyłącznie z czasu, który wydaje się niebezpieczny, szczególnie biorąc pod uwagę, że jestem multiprocessing (aby kod mógł być wykonywany dokładnie w tym samym czasie) . Czy istnieje pewna mądrość dotycząca tego problemu?

Odpowiedz

5

Jest to poprawny sposób wygenerować własny uuid4, jeśli trzeba to zrobić:

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

Python należy robić to automatycznie - kod ten jest prosto z uuid.uuid4, gdy rodzimy _uuid_generate_random nie istnieje. Musi być coś nie tak z twoim _uuid_generate_random twojej platformy.

Jeśli musisz to zrobić, nie poprzestawaj na tym problemie i pozwól wszystkim innym na twojej platformie cierpieć; report the bug.

+0

Wystarczająco, ustawienie uuid._uuid_generate_random = Brak ma rację. Musi to być błąd w libc uuid_generate_random() w Mac OS X. Dziękuję za sugestię, aby zgłosić raport o błędzie: http://bugs.python.org/issue8621 – yig

+0

Złożyłem również błąd platformy na Mac OS X: http://openradar.appspot.com/radar?id=334401 – yig

0

Nie widzę sposobu, aby to zadziałało. Ale możesz wygenerować wszystkie uuidy w głównym wątku i przekazać je pracownikom.

0

To działa dobrze dla mnie. Czy twoja instalacja w Pythonie ma os.urandom? W przeciwnym razie losowanie liczb losowych będzie bardzo słabe i doprowadzi do tego problemu (zakładając, że nie ma również natywnego modułu UUID, uuid._uuid_generate_random).

+0

Jest to na Mac OS X (10.6.3, jeśli to ma znaczenie). Testowałem i działa dobrze na mojej maszynie Ubuntu. Oba mają os.urandom. – yig

Powiązane problemy