2015-10-20 5 views
5

पर mysql कनेक्शन पास करते समय टूटी हुई पाइप प्राप्त करना मैं अजगर में एक थ्रेड से एक MySQL कनेक्शन पास करने का प्रयास कर रहा हूं। यदि मैं कार्यकर्ता वर्ग के अंदर mysql का प्रारंभिकरण करता हूं, तो कोई त्रुटि नहीं है।पाइथन थ्रेड

हालांकि, यह कनेक्शन तो मैं बस फोन करने वाले समारोह से mysql कनेक्शन गुजर कोशिश के लिए महंगा हो सकता है (नीचे दिए गए कोड को देखें)। लेकिन यह इस त्रुटि को फेंकता रहता है:

(2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))

कोई विचार क्यों? मुझे लगता है कि इसकी वजह से जिस तरह से हम mysql संबंध में उत्तीर्ण होने की

इसके बजाय mysql कनेक्शन

def worker(db): 
""" Distributes the workload for a thread 
""" 
while True: 
    item = queue_handler.get() 
    perform_insert(item, db) 
    queue_handler.task_done() 

def insert_bulk(params): 
""" Handles the insert 
""" 
    cntr = 0 
    res = [] 
    cannot_read = [] 
    (data, cms, report_id) = params 

    db = nmi_mysql.DB(CONFIG['earnings_db'], True) 

    for i in range(10): 
     thrd = threading.Thread(target=worker, args=(db,)) 
     thrd.deamon = True 
     thrd.start() 

    for row in data: 
     split_files = row.split(',') 

     if len(split_files) != 34: 
      cannot_read.append(split_files) 
      continue 

     now = datetime.datetime.now() 

     res.append(<some data to insert>) 

     if len(res) == 750 or cntr == len(data): 
      queue_handler.put([res, cms, report_id]) 
      res = [] 

     cntr += 1 

    queue_handler.join() 

    db.close() 

    return [len(res), cms] 

अद्यतन गुजरती हैं, हम एक कनेक्शन पूल बनाया है और धागे में है कि पूल का उपयोग करें। इस तरह, हम थ्रेड स्तर पर पूल से कनेक्शन प्राप्त करते हैं।

+0

आमतौर पर, डेटाबेस कनेक्शन का उपयोग विभिन्न क्लाइंट थ्रेड के बीच नहीं किया जाना चाहिए: वे _thread-safe_ नहीं हैं। यदि कोई आपको बेहतर उत्तर नहीं देता है, तो मैं आपको प्रत्येक कनेक्शन को उसी थ्रेड में संसाधित करने की सलाह दूंगा: खोलें, उपयोग करें और बंद करें। –

+0

@LittleSanti हमने इसके बजाय एक कनेक्शन पूल का उपयोग किया। वास्तव में अच्छी तरह से काम करता है। – Ninz

+0

यह एक पूल का उपयोग करते समय आप एक ही धागे के भीतर पूरी तरह से हर कनेक्शन संभाल ठीक है: कनेक्शन हो रही है, यह उपयोग करते हुए, इसे जारी। कारण अभी भी वही है: कनेक्शन आमतौर पर थ्रेड-सुरक्षित नहीं होते हैं। –

उत्तर

2

डाटाबेस कनेक्शन सुरक्षित थ्रेड नहीं हैं, इसलिए जब आप एक धागे से उन्हें पारित नहीं करना चाहिए। एक कनेक्शन पूल अनुरोधों के बीच खुले कनेक्शन पर रखता है, इसलिए पूल से कनेक्शन प्राप्त करना तेज़ है, इसे क्वेरी के लिए उपयोग करें, और फिर इसे छोड़ दें।

यह related answer डेटाबेस कनेक्शन की थ्रेड सुरक्षा पर कुछ उपयोगी लिंक है।

+0

मेरा उत्तर ज्यादातर टिप्पणियों का सारांश है। मैंने अभी इसे पोस्ट किया है इसलिए यह प्रश्न अनुत्तरित प्रश्नों की सूची से हटा दिया जाएगा। –

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