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?
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
Złożyłem również błąd platformy na Mac OS X: http://openradar.appspot.com/radar?id=334401 – yig