from tornado import web, gen
import tornado, time
class CoroutineFactorialHandler(web.RequestHandler):
@web.asynchronous
@gen.coroutine
def get(self, n, *args, **kwargs):
n = int(n)
def callbacker(iterator, callback):
try:
value = next(iterator)
except StopIteration:
value = StopIteration
callback(value)
def factorial(n):
x = 1
for i in range(1, n+1):
x *= i
yield
yield x
iterator = factorial(n)
t = time.time()
self.set_header("Content-Type", "text/plain")
while True:
response = yield gen.Task(callbacker, iterator)
#log.debug("response: %r" %response)
if response is StopIteration:
break
elif response:
self.write("took : %f sec" %(time.time() - t))
self.write("\n")
self.write("f(%d) = %d" %(n, response))
self.finish()
application = tornado.web.Application([
(r"^/coroutine/factorial/(?P<n>\d+)", CoroutineFactorialHandler),
#http://localhost:8888/coroutine/factorial/<int:n>
])
if __name__ == "__main__":
application.listen(8888)
ioloop = tornado.ioloop.IOLoop.instance()
ioloop.start()
21 реда, изтеглени по-горе, е простият факторен калкулатор. той зацикля N пъти, като генератор.
проблемът е, че когато този код се изпълнява, той блокира цялото торнадо.
това, което искам да постигна, е да напиша някакъв помощник за торнадо, който третира генераторите като съпрограма и следователно може да обслужва заявки по асинхронен начин. (Прочетох Използване на прост генератор на Python като съвместна рутина в асинхронен манипулатор на Tornado?)
защо простият цикъл за увеличаване и умножаване по n блокира цялото торнадо?
редактиране: редактирах кода, за да включва цялото приложение, което можете да стартирате и тествате. Пускам торнадо 3.1.1 на python 2.7
get
наистина да приеме такива аргументи? (Когато опитам това с Tornado 3.1.1 на Python 2.7.2, получавамTypeError: get() takes at least 2 arguments (1 given)
. Не мисля, че това е вашият проблем тук — ако го променя да не приема аргументи и използваself.get_argument(n)
, мисля, че демонстрира проблема ви както и да е. Но не съм сигурен. И така, това всъщност вашият код ли е? Ако е така, коя версия използвате? - person abarnert   schedule 20.09.2013self.get_argument
за четене на низа на заявката, демонстрира същото поведение. Нямам отговор за вас. Ще разгледам по-отблизо, когато имам възможност, но се надявам, че някой друг, който използва Tornado повече от мен, ще дойде първи. - person abarnert   schedule 21.09.2013