python - how to solve this deadlock with gevent and oursql -
मेरे पास एक जटिल परियोजना से निम्नलिखित कोड है:
आयात आयात बंदर बंदर से Patch_all () import geost आयात oursql def रन (num): conn = oursql.connect (host = ...) कर्सर = conn.cursor () कर्सर। Execute ('शुरू लेनदेन') मैं श्रेणी में (2): प्रिंट Num, i कर्सर.एक्सिक्यूट ('UPDATE userobj SET टाइमस्टैम्प = (टाइमस्टैम्प + 1) WHERE id = 1') gevent.sleep () कर्सर.एक्सिक्यूट ('रोलबैक') proc = [gevent.spawn (run, i) i के लिए इंजन में InnoDB है और आउटपुट है: 0 0 1 0 फिर प्रोग्राम लटका हुआ है। मुझे पता है कि कारण है mysql पहली हरेलेट के बाद पंक्ति ताला अद्यतन कथन कार्यान्वित करता है, तो अन्य हरेलेट में अद्यतन ब्लॉक होगा। लेकिन गेट पर दूसरे एक ब्लॉक के बाद गैजेट अब पहले हरेलेट को वापस क्यों नियंत्रण नहीं लेते हैं? और मुझे आश्चर्य है कि इससे पहले कि gevent.sleep ? पीएस मूल स्थिति एक वेबसाइट परियोजना में है मैंने पमोंगो और एसक्यूएललेमी संचालन मिश्रित किया और साइट की सेवा के लिए गनटोर्न का इस्तेमाल किया। लेकिन मैंने पाया कि समानांतर अनुरोध हमेशा के लिए ब्लॉक कर सकते हैं। डीबग के एक लंबे समय के बाद, मैं अंत में यह पता लगा कि यह pymongo के कारण कुछ गर्तिका कार्यों का इस्तेमाल किया गया था, जिसके कारण गैवेंट एक और हरे रंग की जगह पर स्विच हो गया था, जिसके परिणामस्वरूप उपरोक्त कोड के रूप में एक गतिरोध दिखाता है।
धन्यवाद! oursql को कुछ शुद्ध- के साथ प्रतिस्थापित करना है
pymysql । वास्तव में oursql सी में लिखा है और इस तरह gevent के साथ असंगत है।
Comments
Post a Comment