टोरनाडो को आपके सभी परिचालनों को एक थ्रेड में चलाने के लिए डिज़ाइन किया गया है, लेकिन जितना संभव हो सके अवरुद्ध करने से बचने के लिए एसिंक्रोनस I/O का उपयोग करें। यदि आपके द्वारा उपयोग किए जाने वाले डीबी में एक्रोन्रोनस पायथन बाइंडिंग्स हैं (आदर्श रूप से टोरनाडो के लिए तैयार किए गए हैं, जैसे कि Motor मोंगोडीबी के लिए या momoko पोस्टग्रेज़ के लिए), तो आप सर्वर को अवरुद्ध किए बिना अपने डीबी प्रश्नों को चलाने में सक्षम होंगे; कोई अलग प्रक्रिया या धागे की जरूरत नहीं है।
सटीक उदाहरण दिया था, जहां time.sleep(1)
कहा जाता है के लिए, आप बवंडर coroutines के माध्यम से एसिंक्रोनस यह करने के लिए इस दृष्टिकोण का उपयोग कर सकते हैं:
#!/usr/bin/python
import tornado.web
from tornado.ioloop import IOLoop
from tornado import gen
import time
@gen.coroutine
def async_sleep(seconds):
yield gen.Task(IOLoop.instance().add_timeout, time.time() + seconds)
class TestHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
for i in xrange(100):
print i
yield async_sleep(1)
self.write(str(i))
self.finish()
application = tornado.web.Application([
(r"/test", TestHandler),
])
application.listen(9999)
IOLoop.instance().start()
दिलचस्प हिस्सा async_sleep
है। वह विधि एक एसिंक्रोनस टास्क बना रही है, जो ioloop.add_timeout
विधि को कॉल कर रही है। add_timeout
टाइमआउट के समाप्त होने की प्रतीक्षा करते समय ioloop को अवरुद्ध किए बिना, दिए गए सेकंड के बाद निर्दिष्ट कॉलबैक चलाएगा।
add_timeout(deadline, callback) # deadline is the number of seconds to wait, callback is the method to call after deadline.
आप ऊपर के उदाहरण में देख सकते हैं, हम केवल वास्तव में एक पैरामीटर add_timeout
को स्पष्ट रूप से कोड में प्रदान कर रहे हैं, जिसका अर्थ है कि हम अंत में यह इस:
add_timeout(time.time() + seconds, ???)
यह दो तर्क की उम्मीद
हम अपेक्षित कॉलबैक पैरामीटर प्रदान नहीं कर रहे हैं। वास्तव में, जब gen.Task
add_timeout
निष्पादित करता है, तो यह स्पष्ट रूप से प्रदान किए गए पैरामीटर के अंत में callback
कीवर्ड तर्क जोड़ता है। तो यह:
yield gen.Task(loop.add_timeout, time.time() + seconds)
परिणाम इस में gen.Task() के अंदर निष्पादित किया जा रहा:
loop.add_timeout(time.time() + seconds, callback=gen.Callback(some_unique_key))
gen.Callback
टाइमआउट के बाद मार डाला है, यह संकेत है gen.Task
पूरा हो गया है कि, और प्रोग्राम निष्पादन होगा अगली पंक्ति पर जारी रखें। यह प्रवाह पूरी तरह से समझने में मुश्किल है, कम से कम पहले (यह निश्चित रूप से मेरे लिए था जब मैंने इसे पहले पढ़ा था)। यह शायद Tornado gen module documentation पर कुछ बार पढ़ने में मददगार होगा।