2010-05-03 14 views
6

के साथ अच्छी तरह से नहीं खेलता है, मैं एक फ़ाइल नाम के लिए यूयूआईडी उत्पन्न करने की कोशिश कर रहा हूं, और मैं मल्टीप्रोसेसिंग मॉड्यूल का भी उपयोग कर रहा हूं। अनजाने में, मेरे सभी यूयूड्स बिल्कुल वही खत्म हो जाते हैं। यहाँ एक छोटा सा उदाहरण है:पायथन मल्टीप्रोसेसिंग 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 के कोड में peeked, और यह निर्भर करता है-ऑन-मंच अनियमितता के लिए कुछ ओएस-स्तर दिनचर्या का उपयोग करने लगता है, इसलिए मैं एक अजगर के रूप में स्टम्प्ड हूँ -लेवल समाधान (यूयूआईडी मॉड्यूल को पुनः लोड करने या एक नया यादृच्छिक बीज चुनने जैसा कुछ करने के लिए)। मैं uuid.uuid1() का उपयोग कर सकता हूं, लेकिन केवल 8 अंक भिन्न हैं और मुझे लगता है कि समय से विशेष रूप से व्युत्पन्न होता है, जो खतरनाक लगता है, विशेष रूप से यह देखते हुए कि मैं मल्टीप्रोसेसिंग (इसलिए कोड ठीक उसी समय निष्पादित हो सकता है) । क्या इस मुद्दे के बारे में कुछ बुद्धि है?

उत्तर

5

अगर आपको लगता है कि क्या करने की जरूरत यह सही तरीका अपने स्वयं के uuid4 उत्पन्न करने के लिए है:

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

अजगर यह स्वचालित रूप से करना चाहिए - इस कोड है, है ना uuid.uuid4 से बाहर है जब देशी _uuid_generate_random मौजूद नहीं है। आपके प्लेटफॉर्म के _uuid_generate_random के साथ कुछ गड़बड़ होना चाहिए।

यदि आपको ऐसा करना है, तो बस अपने आस-पास काम न करें और अपने मंच पर हर किसी को पीड़ित न करें; report the bug

+0

निश्चित रूप से, uuid._uuid_generate_random = सेटिंग सही नहीं है। मैक ओएस एक्स के libc uuid_generate_random() में एक बग होना चाहिए। बग रिपोर्ट दर्ज करने के सुझाव के लिए धन्यवाद: http://bugs.python.org/issue8621 – yig

+0

मै मैक ओएस एक्स के खिलाफ एक प्लेटफॉर्म बग भी दायर किया: http://openradar.appspot.com/radar?id=334401 – yig

0

मुझे यह काम करने के लिए कोई तरीका नहीं दिख रहा है। लेकिन आप मुख्य धागे में सभी यूयूड्स उत्पन्न कर सकते हैं और उन्हें श्रमिकों को पास कर सकते हैं।

0

यह मेरे लिए ठीक काम करता है। क्या आपके पायथन इंस्टॉलेशन में os.urandom है? यदि नहीं, तो यादृच्छिक संख्या बीजिंग बहुत खराब होगी और इस समस्या का कारण बन जाएगा (माना जाता है कि कोई मूल यूयूआईडी मॉड्यूल भी नहीं है, uuid._uuid_generate_random)।

+0

यह मैक ओएस एक्स (10.6.3, यदि यह मायने रखता है) पर है। मैंने परीक्षण किया और यह मेरी उबंटू मशीन पर ठीक काम करता है। दोनों os.urandom है। – yig

संबंधित मुद्दे