Python多进程与uuid.uuid4()不兼容
我正在尝试为文件名生成一个唯一的标识符(uuid),同时我还在使用多进程模块。结果让我很不爽的是,我生成的所有uuid都是完全一样的。下面是一个简单的例子:
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位数字不同,而且我觉得这些数字主要是基于时间生成的,这让我觉得不太安全,尤其是因为我在使用多进程(这样代码可能会在完全相同的时间执行)。有没有人对此问题有什么好的建议?
4 个回答
0
我也找不到办法让这个工作。不过你可以在主线程里生成所有的UUID,然后把它们传给工作线程。
0
这对我来说没问题。你的Python安装里有os.urandom这个功能吗?如果没有的话,随机数的生成就会很差,这可能会导致你遇到的问题(假设你的环境里也没有原生的UUID模块,也就是uuid._uuid_generate_random)。
6
这是生成你自己 uuid4 的正确方法,如果你需要这样做的话:
import os, uuid
return uuid.UUID(bytes=os.urandom(16), version=4)
Python 应该会自动处理这个问题——这段代码就是从 uuid.uuid4 中提取的,当本地的 _uuid_generate_random 不存在时会用到。你的平台上的 _uuid_generate_random 可能出了点问题。
如果你真的需要这样做,不要自己绕过这个问题,让其他人也受到影响;请报告这个bug。