Многопроцессорная обработка Python не очень хорошо работает с uuid.uuid4 () - PullRequest
6 голосов
/ 03 мая 2010

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

Ответы [ 3 ]

5 голосов
/ 05 мая 2010

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

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

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

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

0 голосов
/ 04 мая 2010

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

0 голосов
/ 03 мая 2010

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

...