Многопроцессорная обработка Python не играет приятно с uuid.uuid4 ()

Я пытаюсь генерировать 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 цифр отличаются, и я думаю, там получены исключительно со времени, которое кажется опасным особенно учитывая это, я - многопроцессорная обработка (таким образом, код мог выполняться в точно то же время). Есть ли некоторая Мудрость там об этой проблеме?

6
задан yig 3 May 2010 в 16:44
поделиться

3 ответа

Это правильный способ генерации собственного uuid4, если вам нужно это сделать:

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

Python должен делать это автоматически - этот код прямо из uuid.uuid4, когда родной _uuid_generate_random не существует. Должно быть, что-то не так с _uuid_generate_random вашей платформы.

Если вы вынуждены это сделать, не обходите это сами и не позволяйте страдать всем остальным на вашей платформе; сообщите об ошибке.

5
ответ дан 17 December 2019 в 04:43
поделиться

Я тоже не вижу способа заставить эту работу работать. Но вы можете просто сгенерировать все uuid в основном потоке и передать их рабочим.

0
ответ дан 17 December 2019 в 04:43
поделиться

У меня это нормально работает. Есть ли в вашей установке Python os.urandom? В противном случае заполнение случайных чисел будет очень плохим и приведет к этой проблеме (при условии, что нет собственного модуля UUID, uuid._uuid_generate_random).

0
ответ дан 17 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: