मैंने टर्ननाडो का उपयोग करते हुए अजगर में लिखे गए एक व्यापक HTTP सर्वर विकसित किए हैं। कुछ विशेष सेट किए बिना, सर्वर अनुरोध पर अवरुद्ध करता है और केवल एक समय में एक को संभाल सकता है। अनुरोध मूल रूप से डेटा (mysql/redis) तक पहुंचते हैं और इसे जेसन में प्रिंट करते हैं। ये अनुरोध सबसे खराब मामले में एक सेकंड के ऊपर ले जा सकते हैं। समस्या यह है कि एक अनुरोध में आता है जो लंबे समय तक (3 एस) लेता है, फिर तुरंत एक आसान अनुरोध आता है जिसके बाद इसे संभालने के लिए 5ms लगेंगे। ठीक है क्योंकि पहला अनुरोध 3 एस लेने जा रहा है, दूसरा तब तक शुरू नहीं होता जब तक कि पहले व्यक्ति नहीं किया जाता। तो दूसरा अनुरोध संभाला जाता है> 3 एस संभाला जा सकता है।पायथन http सर्वर, एकाधिक एक साथ अनुरोध
मैं इस स्थिति को बेहतर कैसे बना सकता हूं? मुझे अन्य अनुरोधों के बावजूद निष्पादन शुरू करने के लिए उस दूसरे सरल अनुरोध की आवश्यकता है। मैं अजगर के लिए नया हूं, और अपाचे/PHP के साथ अधिक अनुभवी हूं जहां एक दूसरे को अवरुद्ध करने के दो अलग-अलग अनुरोधों की कोई धारणा नहीं है। मैंने php उदाहरण का अनुकरण करने के लिए mod_python में देखा है, लेकिन ऐसा लगता है कि यह भी ब्लॉक है। क्या मैं अपनी कार्यक्षमता प्राप्त करने के लिए अपना टर्ननाडो सर्वर बदल सकता हूं? जहां भी मैं पढ़ता हूं, यह कहता है कि टर्ननाडो कई एक साथ अनुरोधों को संभालने में बहुत अच्छा है।
यहां डेमो कोड है जिसके साथ मैं काम कर रहा हूं। मेरे पास नींद कमांड है जिसका उपयोग मैं परीक्षण करने के लिए कर रहा हूं यदि समवर्ती कार्य करता है। क्या समरूपता का परीक्षण करने का एक उचित तरीका है?
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.gen
import time
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def handlePing1(self):
time.sleep(4)#simulating an expensive mysql call
self.write("response to browser ....")
self.finish()
def get(self):
start = time.time()
self.handlePing1()
#response = yield gen.Task(handlePing1)#i see tutorials around that suggest using something like this ....
print "done with request ...", self.request.path, round((time.time()-start),3)
application = tornado.web.Application([
(r"/.*", MainHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
port=8833;
http_server.listen(port)
print "listening on "+str(port);
tornado.ioloop.IOLoop.instance().start()
किसी भी मदद के लिए धन्यवाद!