मान लीजिए मैं एक लंबे चल समारोह है में एक अवरुद्ध समारोह कन्वर्ट करने के लिए:अजगर तूफान - उलझन में कैसे एक गैर अवरुद्ध समारोह
def long_running_function():
result_future = Future()
result = 0
for i in xrange(500000):
result += i
result_future.set_result(result)
return result_future
मैं एक हैंडलर में एक get समारोह है कि इसके बाद के संस्करण परिणाम के साथ उपयोगकर्ता प्रिंट है पाश के लिए एक की कि xrange में सभी संख्या जोड़ता है:
@gen.coroutine
def get(self):
print "start"
self.future = long_running_function()
message = yield self.future
self.write(str(message))
print "end"
अगर मैं एक साथ दो वेब ब्राउज़र पर उपरोक्त कोड चलाने के लिए, मैं:
शुरू
अंत
शुरू
अंत
कौन सा अवरुद्ध किया जा रहा है। मेरी समझ से, @gen.coroutine
और yield
कथन प्राप्त कार्य में IOLoop को अवरुद्ध नहीं करता है, हालांकि, यदि कोई कार्य जो अवरोधक सह-रूटीन के अंदर है, तो यह IOLoop को अवरुद्ध करता है।
इसलिए मैंने जो कुछ किया है, वह long_running_function
को कॉलबैक में बदलना है, और इसके बजाय yield gen.Task
का उपयोग करना है।
@gen.coroutine
def get(self):
print "start"
self.future = self.long_running_function
message = yield gen.Task(self.future, None)
self.write(str(message))
print "end"
def long_running_function(self, arguments, callback):
result = 0
for i in xrange(50000000):
result += i
return callback(result)
यह भी कटौती नहीं करता है, यह मुझे देता है:
शुरू
अंत
शुरू
अंत
मैं में उन पर अमल करने धागे का उपयोग कर सकते समानांतर, लेकिन यह जाने का रास्ता प्रतीत नहीं होता है, क्योंकि मैं बहुत अधिक खुलता हूं विज्ञापन, और टोरनाडो के उपयोगकर्ता गाइड के अनुसार, यह महंगा हो सकता है।
लोग टोरनाडो के लिए एसिंक पुस्तकालय कैसे लिखते हैं?
मुझे लगता है कि आप सही हैं, लेकिन [कॉलिंग-अवरुद्ध-कार्य] (प्रेमी पी: //www.tornadoweb.org/en/stable/guide/coroutines.html#calling-blocking-functions) सीपीयू-बाउंड या इवेंट-संचालित का उल्लेख न करें, यह केवल इतना कहता है: "कॉल करने का सबसे आसान तरीका कोरआउटिन से अवरुद्ध करने का कार्य थ्रेडपूल एक्स्सेलर का उपयोग करना है, जो फ्यूचर्स लौटाता है जो कोरआउट के साथ संगत होते हैं " –