Я пытаюсь генерировать uuid для имени файла, и я также использую многопроцессорный модуль. Неприятно, все мои uuids заканчиваются точно то же. Вот небольшой пример:
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()
Я посмотрел в код uuid.py, и это кажется использованию depending-on-the-platform некоторыми стандартными программами уровня ОС для случайности, таким образом, я озадачен относительно решения уровня Python (чтобы сделать что-то, любят, перезагружают uuid модуль или выбирают новое случайное семя). Я мог использовать uuid.uuid1 (), но только 8 цифр отличаются, и я думаю, там получены исключительно со времени, которое кажется опасным особенно учитывая это, я - многопроцессорная обработка (таким образом, код мог выполняться в точно то же время). Есть ли некоторая Мудрость там об этой проблеме?
Это правильный способ генерации собственного uuid4, если вам нужно это сделать:
import os, uuid
return uuid.UUID(bytes=os.urandom(16), version=4)
Python должен делать это автоматически - этот код прямо из uuid.uuid4, когда родной _uuid_generate_random не существует. Должно быть, что-то не так с _uuid_generate_random вашей платформы.
Если вы вынуждены это сделать, не обходите это сами и не позволяйте страдать всем остальным на вашей платформе; сообщите об ошибке.
Я тоже не вижу способа заставить эту работу работать. Но вы можете просто сгенерировать все uuid в основном потоке и передать их рабочим.
У меня это нормально работает. Есть ли в вашей установке Python os.urandom? В противном случае заполнение случайных чисел будет очень плохим и приведет к этой проблеме (при условии, что нет собственного модуля UUID, uuid._uuid_generate_random).