फ्लास्क में बनाया गया वेब सर्वर उत्पादन में उपयोग करने के लिए बिल्कुल नहीं है, क्योंकि आप सूचीबद्ध हैं - यह सिंगल थ्रेडेड है, और यदि कोई अनुरोध गैर-तुच्छ समय के लिए अवरुद्ध हो जाता है तो आसानी से नीचे गिर जाता है। फ्लास्क प्रलेखन lists several options for deploying it in a production environment; mod_wsgi
, gunicorn
, uSWGI
, आदि। उन सभी परिनियोजन विकल्प थ्रेड, प्रक्रियाओं, या गैर-अवरुद्ध I/O के माध्यम से समेकन को संभालने के लिए तंत्र प्रदान करते हैं। नोट, हालांकि, अगर आप सीपीयू-बाउंड ऑपरेशंस कर रहे हैं, तो एकमात्र विकल्प जो सही समेकन देगा, कई प्रक्रियाओं का उपयोग करना है।
यदि आप tornado
का उपयोग करना चाहते हैं, तो आपको tornado
शैली में अपने एप्लिकेशन को फिर से लिखना होगा। चूंकि स्पष्ट आर्किंक्रोनस I/O पर आधारित इसकी वास्तुकला, यदि आप इसे WSGI एप्लिकेशन के रूप में तैनात करते हैं तो आप इसकी एसिंक्रोनस विशेषताओं का उपयोग नहीं कर सकते हैं। "tornado
शैली" का मूल रूप से सभी I/O संचालन के लिए गैर-अवरुद्ध API का उपयोग करना और किसी भी लंबे समय से चलने वाले CPU-bound संचालन को संभालने के लिए उप-प्रक्रियाओं का उपयोग करना है। tornado
प्रलेखन कैसे अतुल्यकालिक मैं/हे कॉल करने के लिए शामिल किया गया है, लेकिन यहाँ यह कैसे काम करता की एक बुनियादी उदाहरण है:
from tornado import gen
@gen.coroutine
def fetch_coroutine(url):
http_client = AsyncHTTPClient()
response = yield http_client.fetch(url)
return response.body
response = yield http_client.fetch(curl)
कॉल वास्तव में अतुल्यकालिक है; जब अनुरोध शुरू होता है तो यह टर्ननाडो इवेंट लूप पर नियंत्रण वापस कर देगा, और प्रतिक्रिया मिलने के बाद फिर से शुरू हो जाएगी। यह एकाधिक एसिंक्रोनस HTTP अनुरोधों को समवर्ती रूप से चलाने की अनुमति देता है, सब एक थ्रेड के भीतर।हालांकि, ध्यान दें कि fetch_coroutine
के अंदर जो कुछ भी आप करते हैं असीमित I/O ईवेंट लूप को अवरुद्ध कर देगा, और उस कोड के चलते कोई अन्य अनुरोध संभाला नहीं जा सकता है।
लंबे समय से चल रहे CPU- बाध्य संचालन से निपटने के लिए, आपको इवेंट लूप को अवरुद्ध करने से बचने के लिए कार्य को एक उपप्रोसेसर में भेजने की आवश्यकता है। पायथन के लिए, आमतौर पर इसका मतलब है multiprocessing
या concurrent.futures
का उपयोग करना। tornado
के साथ उन पुस्तकालयों को एकीकृत करने के तरीके के बारे में अधिक जानकारी के लिए मैं this question पर एक नज़र डालेगा। ध्यान दें कि आप सिस्टम पर मौजूद CPUs की संख्या से अधिक एक प्रक्रिया पूल को बनाए रखना नहीं चाहते हैं, इसलिए इस बात पर विचार करें कि आप कितने समवर्ती CPU-bound संचालन को किसी भी समय चलने की उम्मीद करते हैं जब आप यह पता लगा रहे हैं कि कैसे एक मशीन से परे इसे स्केल करने के लिए।
बवंडर प्रलेखन has a section dedicated to running behind a load balancer, साथ ही साथ। वे इस उद्देश्य के लिए एनजीआईएनएक्स का उपयोग करने की सलाह देते हैं।
बस एक हैंडलर को '@ tornado.gen.coroutine' सजावट जोड़ने वाला यह अतुल्यकालिक नहीं बनाता है। आपको वास्तव में हैंडलर के अंदर भी गैर-अवरुद्ध कॉल करना होगा। यदि आप फ़ंक्शन में कोई अवरुद्ध करने वाले ऑपरेशन करते हैं, तो संपूर्ण ईवेंट लूप अवरुद्ध हो जाएगा, भले ही आप 'कोरआउटिन' सजावट का उपयोग करें या नहीं। – dano
आप सही हैं, मेरी गलती। क्या आप async अनुरोध प्राप्त करने के लिए grequests का उपयोग कर सकते हैं? – ragingSloth
'grequests' एसिंक्रोनस I/O, हां प्रदान करने के लिए' gevent' का उपयोग करता है। यदि आप 'टॉरनाडो' का उपयोग कर रहे हैं, तो शायद आप अपने अंतर्निर्मित 'AsyncHTTPClient' का उपयोग करना चाहते हैं, हालांकि, यह टर्ननाडो ईवेंट लूप के साथ एकीकृत है। – dano