我有一個python生成器函數,它產生大量的文本。我想爲tornado.web.RequestHandler
子類寫一個get
方法,它將遍歷生成器,將塊寫入響應中。使用一個簡單的Python生成器作爲Tornado異步處理程序中的協同例程?
由於這是Tornado,並且由於生成器可能需要一秒鐘才能處理,所以我認爲使處理器異步,使用此生成器作爲協調程序並在每次之後將控制權交給IOLoop塊。但是,我無法做出如何做到這一點的頭或尾。
這是我的例子(阻塞)代碼:
class TextHandler(web.RequestHandler):
@web.asynchronous
def get(self, n):
generator = self.generate_text(100000)
# Clearly, this will block. How to make it asynchronous?
for text in generator:
self.write(text)
def generate_text(n):
for x in xrange(n):
if not x % 15:
yield "FizzBuzz\n"
elif not x % 5:
yield "Buzz\n"
elif not x % 3:
yield "Fizz\n"
else:
yield "%s\n" % x
我怎樣才能讓這個處理異步工作?
這不是真的清楚你有什麼打算來實現。你想在所有的生成器值迭代之前離開get(),並且在新值準備好時返回?如果是這樣,比你不能那樣做。在這個特定的函數中,你的代碼是單線程的,如果你退出,那麼你的上下文就會鬆動。另一方面,標記爲異步的方法通常意味着處理程序被稱爲形成線程池,因此,應該可以在該處阻止。 – real4x 2012-01-11 05:43:12
只要生成器存在,它就擁有我需要的所有上下文。這就是發電機的美妙之處:單一線程中的協同程序。當然,你必須自己處理調度,這可能是真正的問題。 – 2012-01-11 16:12:27