2010-05-03 66 views
6

不能很好地發揮我想爲一個文件名生成一個uuid,並且我也使用了多處理模塊。不愉快的是,我所有的uuids都完全一樣。這裏是一個小例子:Python多處理與uuid.uuid4()

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位數字不同,我認爲這是從時間推導出來的,這似乎很危險,尤其是考慮到我是多處理器(所以代碼可能在同一時間執行) 。有關於這個問題的智慧嗎?

回答

5

這是生成自己的uuid4正確的方法,如果你需要做的是:

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

的Python應自動做這個 - 這個代碼是右出uuid.uuid4的,當本地_uuid_generate_random不存在。你的平臺的_uuid_generate_random肯定有問題。

如果你必須這樣做,不要只是自己解決它,讓你的平臺上的其他人受苦; report the bug

+0

果然,設置uuid._uuid_generate_random = None是正確的。必須是Mac OS X的libc uuid_generate_random()中的錯誤。感謝您提交錯誤報告的建議:http://bugs.python.org/issue8621 – yig 2010-05-05 12:01:41

+0

我還針對Mac OS X提交了一個平臺錯誤:http://openradar.appspot.com/radar?id=334401 – yig 2010-05-05 14:19:45

0

我沒有看到一種方法來使這項工作。但是您可以在主線程中生成所有uuids並將其傳遞給工作人員。

0

這對我很好。你的Python安裝是否有os.urandom?如果不是,隨機數播種將會很差,並會導致這個問題(假設沒有本地UUID模塊,uuid._uuid_generate_random)。

+0

這是在Mac OS X(10.6.3,如果有的話)。我測試過,它在我的Ubuntu機器上工作正常。兩者都有os.urandom。 – yig 2010-05-04 22:27:51