2016-06-23 10 views
5

ब्लॉक करता है मैं एक सहकर्मी के साथ एक तर्क सुलझाने की कोशिश कर रहा हूं। मान लें कि मेरे पास एक पायथन 2.6 ऐप है जो पोस्टग्रेज़ डेटाबेस के साथ संवाद करने के लिए psycopg2 का उपयोग करता है। ऐप बहुप्रचारित है। जब कोई थ्रेड psycopg2 का उपयोग कर डेटाबेस कॉल करता है, तो क्या यह जीआईएल जारी करता है ताकि अन्य धागे डेटाबेस कॉल भी कर सकें?क्या Python 2.x में 'psycopg2` जीआईएल

+0

कोशिश स्रोत में (https://github.com/psycopg/psycopg2/search?utf8=%E2%9C%93&q=py_begin_allow_threads+OR+pyeval_save_thread&type=Code) [ 'Py_BEGIN_ALLOW_THREADS' या' PyEval_Save_Thread' के लिए खोज] । वे यहां और वहां छिड़के जाते हैं, जांचें कि आपका विशिष्ट परिदृश्य लागू होता है या नहीं। –

उत्तर

2

the Psycopg release notes पर एक त्वरित नज़र से, जीआईएल जारी करने के कई संदर्भ हैं। तो स्पष्ट रूप से यह उचित होने पर जीआईएल जारी करने की कोशिश करता है। आपने एक विशिष्ट परिदृश्य के बारे में नहीं पूछा था, इसलिए मुझे नहीं लगता कि एक और विशिष्ट उत्तर संभव है।

+0

"एक विशिष्ट परिदृश्य" तालिका से सामान का चयन करने, बस सबसे आम डेटाबेस ऑपरेशन कहें? –

0

जैसा कि आपने कहा था, एक नियम मौजूद है कि जीआईएल हासिल करने वाला केवल थ्रेड पाइथन ऑब्जेक्ट्स पर काम कर सकता है या पायथन/सी एपीआई फ़ंक्शंस को कॉल कर सकता है। निष्पादन की सहमति को अनुकरण करने के लिए, पाइथन दुभाषिया नियमित रूप से धागे को स्विच करने का प्रयास करता है। लॉक को आई/ओ ऑपरेशंस को संभावित रूप से अवरुद्ध करने जैसे फ़ाइल को पढ़ने या लिखने के लिए भी जारी किया जाता है, ताकि इस दौरान अन्य पायथन धागे चल सकें।

अधिकांश एक्सटेंशन कोड (psycopg2 के कोड शामिल) जीआईएल जोड़ तोड़ निम्नलिखित सरल संरचना है:

Save the thread state in a local variable. 
Release the global interpreter lock. 
... Do some blocking I/O operation ... 
Reacquire the global interpreter lock. 
Restore the thread state from the local variable. 

इसका मतलब यह है कि जब एक अवरुद्ध I/O ऑपरेशन (Postgres से नेटवर्क प्रतिक्रिया की प्रतीक्षा करने, उदाहरण के लिए) होता है , जीआईएल जारी किया गया है और अन्य धागे उनके निष्पादन जारी रख सकते हैं। जब ब्लॉकिंग I/O ऑपरेशन पूरा हो जाता है, तो थ्रेड जीआईएल हासिल करने का प्रयास करता है, और अंततः निष्पादन (परिणाम परिणाम आदि) जारी रखता है जब यह अंततः इसे प्राप्त करता है।

psycopg2 के कार्यान्वयन here पर एक नज़र डालें।