2012-02-19 5 views
9

में निष्पादित नहीं कर रहा है मैं GAE पर पायथन का उपयोग करके एक सरल वेब ऐप बनाने की कोशिश कर रहा हूं। ऐप को प्रति अनुरोध प्राप्त कुछ धागे को बढ़ाने की जरूरत है। इसके लिए मैं अजगर की थ्रेडिंग लाइब्रेरी का उपयोग कर रहा हूं। मैं सभी धागे उगता हूं और फिर उन पर इंतजार करता हूं।GAE पायथन थ्रेड समानांतर

t1.start() 
t2.start() 
t3.start() 

t1.join() 
t2.join() 
t3.join() 

आवेदन तथ्य यह है कि धागे क्रमानुसार बल्कि समवर्ती से चल रहे हैं के अलावा ठीक चलाता है (प्रत्येक थ्रेड के रन() विधि की शुरुआत/अंत में टाइम स्टांप मुद्रण द्वारा इस बात की पुष्टि की)।

application: myapp 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: true 

handlers: 
- url: /favicon\.ico 
    static_files: favicon.ico 
    upload: favicon\.ico 

- url: /stylesheet 
    static_dir: stylesheet 

- url: /javascript 
    static_dir: javascript 

- url: /pages 
    static_dir: pages 

- url: .* 
    script: main.app 

मुझे यकीन है कि मेरे स्थानीय GoogleAppLauncher वरीयताओं में स्पष्ट रूप से पथ की स्थापना करके अजगर 2.7 का उपयोग करता है बनाया: मैं लगता है कि http://code.google.com/appengine/docs/python/python27/using27.html#Multithreading में दिए गए multithreading

मेरे app.yaml सक्षम करने के लिए दिए गए निर्देशों का पालन किया है।

मेरे धागे में 2-3 सेकंड का औसत रन-टाइम होता है जिसमें वे यूआरएल ओपन कॉल करते हैं और परिणाम पर कुछ प्रोसेसिंग करते हैं।

क्या मैं कुछ गलत कर रहा हूं, या मल्टीथ्रेडिंग सक्षम करने के लिए कुछ कॉन्फ़िगरेशन खो रहा हूं?

उत्तर

17

क्या आप इसे dev_appserver में अनुभव कर रहे हैं या अपने ऐप को उत्पादन सेवा में अपलोड करने के बाद? GoogleAppLauncher के आपके उल्लेख से ऐसा लगता है कि आप इसे dev_appserver में देख रहे हैं; dev_appserver उत्पादन सर्वर के थ्रेडिंग व्यवहार का अनुकरण नहीं करता है, और आप यह जानकर आश्चर्यचकित होंगे कि यह आपके ऐप को तैनात करने के बाद ठीक काम करता है। एक और विचार (यदि नहीं, एक टिप्पणी यहाँ जोड़ें।)

: http://code.google.com/appengine/docs/python/urlfetch/asynchronousrequests.html

यह दृष्टिकोण: अगर आप ज्यादातर UrlFetch के लिए इंतजार कर रहे हैं, आप कई UrlFetch async इंटरफ़ेस का उपयोग करने के लिए URLFetch द्वारा समानांतर में कॉल चला सकते हैं धागे की आवश्यकता नहीं है। (यह अभी भी dev_appserver में अनुरोधों को समान रूप से समानांतर नहीं करता है, लेकिन यह उत्पादन सर्वर पर ठीक से काम करता है।)

+0

हाँ मैं केवल अपने स्थानीय स्थापना पर समस्या का सामना कर रहा था। जब मैंने अपना ऐप अपलोड किया तो धागे समानांतर में भाग गए। सहायता के लिए धन्यवाद। – Nitesh

1

जीएई के लिए मल्टीथ्रेडिंग नोट केवल अनुरोधों के संचालन के लिए हैं - वे मौलिक रूप से परिवर्तन नहीं करते हैं कि पाइथन धागे कैसे काम करते हैं। विशेष रूप से, threading module docs में "सीपीथन कार्यान्वयन विवरण" नोट अभी भी लागू होता है।

यह भी GAE किए गए दस्तावेज़ों की "सैंडबॉक्सिंग" खंड में नोट उल्लेख के लायक है:

ध्यान दें कि धागे क्रम से जुड़े हुए किया जाएगा जब अनुरोध समाप्त होता है, तो धागे अंत अतीत नहीं चल सकता अनुरोध का

+0

प्रतिक्रिया के लिए धन्यवाद निक। तो, क्या जीएई में मल्टीथ्रेडिंग समर्थन का अर्थ है कि जीएई समानांतर में अनुरोधों को संभालने के लिए कई धागे उत्पन्न कर सकता है, लेकिन एप्लिकेशन कोड स्वयं सहायक धागे को नहीं बढ़ा सकता है? – Nitesh

+0

@Nitesh: सामने वाले अंत से हाथ आपके अनुरोधों को संभालने के लिए आपके आवेदन के कई उदाहरणों को उत्पन्न करने में सक्षम है, हालांकि प्रत्येक उदाहरण में आपके द्वारा बनाए गए थ्रेड अभी भी सामान्य नियमों से बंधे हैं। आप निश्चित रूप से सहायक धागे को बढ़ा सकते हैं, लेकिन जब तक वे I/O पर अवरुद्ध नहीं होते हैं, तब तक वे एक साथ नहीं चलेंगे। –

+0

सहायक धागे में, मैं urllib.urlopen कॉल कर रहा हूं। क्या यह कॉल I/O अवरुद्ध नहीं है? – Nitesh

0

अपने धागे ज्यादातर डेटासंग्रह के संचालन के लिए इंतजार कर रहे हैं, तो आप NDB मॉड्यूल 1.6.2 का हिस्सा है कोशिश कर सकते हैं। आप जो कर रहे हैं उसके लिए अर्थशास्त्र पर्याप्त होगा।

आईआईआरसी, मल्टीथ्रेडिंग ध्वज एक सर्वर उदाहरण को अलग-अलग धागे पर एकाधिक अनुरोधों को पूरा करने में सक्षम बनाता है, लेकिन आपको खुद को थ्रेड शुरू करने की अनुमति नहीं देगा। यदि आपको लौटने से पहले उन्हें सिंक करने की आवश्यकता नहीं है, तो आप उन्हें अलग-अलग tasks पर डाल सकते हैं और उन्हें एक या अधिक कार्य कतारों में भेज सकते हैं।

+2

वास्तव में, पीई 27 रनटाइम धागे बनाने की अनुमति देता है। (लेकिन ऊपर दिए गए पहले उत्तर में जोड़े गए नोट को देखें - अनुरोध समाप्त होने पर वे शामिल हो जाएंगे।) –

+0

सुधार के लिए धन्यवाद, और सलाह के लिए मेरी तुलना में काफी बेहतर है। – rbanffy

+0

"पृष्ठभूमि धागे" नामक एक नई सुविधा है, जो नियमित धागे की तरह है, सिवाय इसके कि पृष्ठभूमि धागे पूरी तरह से अनुरोध के अंत में शामिल नहीं हैं: https://developers.google.com/appengine/docs/python/backends/background_thread – allyourcode