我有一个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