2012-02-07 15 views
5

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

एल्गोरिथ्म कुछ इस तरह काम करता है: -

  1. सर्वर क्लाइंट से कुछ डेटा प्राप्त करता है, इस डेटा एक शब्दकोश ग में बनाया में संग्रहित है। शब्दकोश एपीआई फ़ंक्शन PyDict_New() का उपयोग करके बनाया गया है; सी से इनपुट को एपीआई फ़ंक्शन PyDict_SetItemString() का उपयोग करके शब्दकोश में एक महत्वपूर्ण मूल्य जोड़ी के रूप में संग्रहीत किया जाता है;
  2. अगला, हम पायथन स्क्रिप्ट PyRun_SimpleString() निष्पादित करते हैं; एक पैरामीटर के रूप में स्क्रिप्ट पास करना। यह स्क्रिप्ट सी में बनाए गए शब्दकोश का उपयोग करता है। कृपया ध्यान दें, हम cI में निर्मित शब्दकोश को बनाते हैं, जो कि PyImport_AddModule() विधियों का उपयोग करके स्क्रिप्ट के लिए सुलभ है; और PyModule_AddObject();
  3. हम स्क्रिप्ट में डेटा प्रसंस्करण के परिणाम को उपरोक्त बनाए गए उसी शब्दकोश में एक महत्वपूर्ण मूल्य जोड़ी के रूप में संग्रहीत करते हैं। सी कोड तब स्क्रिप्ट निष्पादित होने के बाद परिणाम परिवर्तनीय (कुंजी-मूल्य जोड़ी) तक पहुंच सकता है।

समस्या समस्या हम सामना कर रहे हैं विभिन्न ग्राहकों से आ रही समवर्ती अनुरोधों के मामले में है। जब विभिन्न अनुरोधों से एकाधिक अनुरोध आते हैं तो हम संदर्भ गणना अपवादों को ऑब्जेक्ट करते हैं। कृपया ध्यान दें, कि उपयोगकर्ता के लिए प्रत्येक अनुरोध के लिए, हम अकेले उस उपयोगकर्ता के लिए एक स्वतंत्र शब्दकोश बनाते हैं। इस समस्या को दूर करने के लिए हमने कॉल को PyRun_SimpleString() में शामिल किया; PyEval_AququireLock() के भीतर; और PyEval_ReleaseLock() ;, लेकिन ऐसा करने के परिणामस्वरूप स्क्रिप्ट निष्पादन अवरुद्ध कॉल है। इसलिए यदि किसी स्क्रिप्ट को निष्पादित करने में लंबा समय लग रहा है, तो अन्य सभी उपयोगकर्ता भी प्रतिक्रिया की प्रतीक्षा कर रहे हैं।

क्या आप कृपया सर्वोत्तम संभव दृष्टिकोण का सुझाव दे सकते हैं या पॉइंटर्स दे सकते हैं कि हम कहां गलत हो रहे हैं। कृपया मुझे अधिक जानकारी के लिए पिंग करें।

किसी भी मदद/मार्गदर्शन की सराहना की जाएगी।

उत्तर

1

शायद आप this answer में उल्लिखित कॉलों में से एक गायब हैं।

+0

संदर्भ जेन के लिए धन्यवाद। संयोग से, मैंने उन कार्यों को कॉल किया था, लेकिन यह अभी भी काम नहीं करेगा। – Will

1

आपको शायद http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock पढ़ना चाहिए आपकी समस्या को पहले पैराग्राफ में समझाया गया है।

जब आप जीआईएल प्राप्त करते हैं, तो पाइथन वस्तुओं के सीधे हेरफेर के आसपास ऐसा करें। PyRun_SimpleString को कॉल आंतरिक रूप से जीआईएल को संभालेगा और इसे लंबे समय से चलने वाले संचालन या केवल हर एक्स निर्देशों पर देगा। हालांकि, यह वास्तव में बहु-थ्रेड नहीं होगा।

संपादित करें:

आप लॉक प्राप्त करने के लिए की जरूरत है और आप सुनिश्चित करने के लिए अजगर को पता है कि यह एक अलग धागा स्थिति में नहीं है की जरूरत है:

// acquire the lock and switch thread state 
PyEval_AcquireLock(); 
PyThreadState_Swap(perThreadState); 

// execute some python code 
PyEval_SimpleString("print 123"); 

// clear the thread state and release the lock 
PyThreadState_Swap(NULL); 
PyEval_ReleaseLock(); 
+0

हैलो टॉम, उत्तर के लिए धन्यवाद। क्या आप इस तथ्य को विस्तारित कर सकते हैं कि यह वास्तव में बहु-थ्रेडेड नहीं होगा?क्या आप कहने का मतलब है कि स्क्रिप्ट को समानांतर में कभी निष्पादित नहीं किया जा सकता है? – Will

+0

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

+0

उस टॉम के लिए धन्यवाद। प्रतिक्रियाओं के लिए अपना समय प्रशंसा करें। कृपया पुष्टि करें: यदि PyRun_SimpleString 2 (या शायद n) अलग "सी" धागे में निष्पादित हो रहा है, तो यह स्वयं जीआईएल का ख्याल रखता है और इसलिए मुझे किसी भी थ्रेड से PyRun_SimpleString पर कॉल करने से पहले ब्लॉक या लॉक करने की आवश्यकता नहीं है। – Will

1

मैं सुझाव है कि आप multiprocessing मॉड्यूल की जांच।

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