Python多处理与uuid.uuid4()不能很好地协同工作

yig*_*yig 6 python random time uuid multiprocessing

我正在尝试为文件名生成一个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()
Run Code Online (Sandbox Code Playgroud)

我偷看了uuid.py的代码,看起来依赖于平台使用一些操作系统级别的例程来实现随机性,所以我对一个python级别的解决方案感到困惑(做一些像重新加载uuid模块或选择一个新的随机种子).我可以使用uuid.uuid1(),但只有8位数字不同,我认为只有时间来源,这似乎很危险,特别是考虑到我是多处理(所以代码可以在完全相同的时间执行).关于这个问题,有没有一些智慧?

Gle*_*ard 5

如果您需要这样做,这是生成您自己的uuid4的正确方法:

import os, uuid
return uuid.UUID(bytes=os.urandom(16), version=4)
Run Code Online (Sandbox Code Playgroud)

Python应该自动执行此操作 - 当本机_uuid_generate_random不存在时,此代码就在uuid.uuid4之外.您的平台的_uuid_generate_random必定有问题.

如果你必须这样做,不要自己解决它,让你平台上的其他人受苦; 报告错误.