我试图为文件名生成一个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个数字不同,而且我认为这是从时间派生出来的,这似乎很危险,尤其是考虑到我正在进行多处理(因此代码可以完全在同一时间执行)。在这个问题上有什么智慧吗?在
如果需要,这是生成您自己的uuid4的正确方法:
Python应该会自动完成这段代码uuid.uuid4,当本机的_uuid_generate_random不存在时。你的平台的“随机生成”一定有问题。在
如果你必须这样做,不要只是自己解决它,让你平台上的其他人受苦;report the bug。在
这对我很好。你的Python安装有乌兰多姆?否则,随机数种子设定将非常差,并将导致此问题(假设也没有本机UUID模块,UUID.\u UUID_generate_random)。在
我也看不出有什么办法能让它成功。但是您可以在主线程中生成所有的uuid并将它们传递给工人。在
相关问题 更多 >
编程相关推荐