2010-05-03 15 views
6

Bir dosya adı için uuid oluşturmaya çalışıyorum ve aynı zamanda çoklu işleme modülünü kullanıyorum. Hoş olmayan bir şekilde, tüm uuids'lerim tamamen aynı. İşte küçük bir örnektir:Python multiprocessing uuid.uuid4 ile güzel oynamıyor()

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() 

Ben uuid.py koduna peeked ve bağlı-platform üzerinde rasgelelikten bazı OS düzeyinde rutinleri kullanmak gibi görünüyor, bu yüzden bir piton olarak stumped -level çözüm (uuid modülünü yeniden yüklemek veya yeni bir rasgele tohum seçmek gibi bir şey yapmak için). Ben uuid.uuid1() kullanabilirim, ancak sadece 8 basamaklı farklıdır ve bence, özellikle de çok işlemcili (kodun tam olarak aynı anda yürütülmesi) göz önüne alındığında, tehlikeli görünen gibi görünüyor . Bu konuda biraz bilgelik var mı?

cevap

5

bunu yapmak gerekiyorsa bu, kendi uuid4 oluşturmak için en doğru yoludur:

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

Python otomatik olarak bu yapması gereken - Bu kod, sağ uuid.uuid4 dışı olduğunda yerli _uuid_generate_random mevcut değil. Platformunuzun _uuid_generate_random'unda bir sorun olmalı.

Bunu yapmak zorunda kalırsanız, sadece kendi etrafında çalışmayın ve platformunuzdaki herkesin acı çekmesine izin vermeyin; report the bug.

+0

Tabii ki, uuid._uuid_generate_random ayarı = Hiçbiri doğru olanı yapmaz. Mac OS X'in libc uuid_generate_random() dosyasında bir hata olmalı. Bir hata raporu dosyalama önerisi için teşekkürler: http://bugs.python.org/issue8621 – yig

+0

Ayrıca Mac OS X'e karşı bir platform hatası yazdım: http://openradar.appspot.com/radar?id=334401 – yig

0

Bu çalışmayı da yapmanın bir yolunu görmüyorum. Ancak, tüm uuid'leri ana iş parçacığı içinde üretebilir ve bunları işçilere aktarabilirsiniz.

0

Bu benim için iyi çalışıyor. Python yüklemenizde os.urandom var mı? Değilse, rasgele sayı ekim çok zayıf olacak ve bu soruna yol açacaktır (aynı zamanda yerel UUID modülü yok ise, uuid._uuid_generate_random).

+0

Mac OS X'de (önemliyse 10.6.3) budur. Test ettim ve Ubuntu makinemde iyi çalışıyor. Her ikisi de os.urandom var. – yig