2014-08-21 2 views
1

У меня этот довольно простой код, взятый из примера.Почему торнадо в python блокирует мои запросы

#!/usr/bin/python 

import tornado.ioloop 
import tornado.web 
import tornado.gen 
import time 

class MainHandler(tornado.web.RequestHandler): 

     @tornado.web.asynchronous 
     @tornado.gen.engine 
     def get(self): 
       for i in range(1,10): 
         self.write("%d<br>" % i) 
         self.flush() 
         yield tornado.gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 1) 
       self.finish() 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
]) 

if __name__ == "__main__": 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

Это не ведет себя так, как я ожидаю. Если я открою окно браузера и назову его на localhost: 8888 /, он покажет 1 [пауза 1 сек] 2 [пауза 1 сек] и т. Д. Если я открою вторую вкладку, сделав тот же запрос, она будет блокироваться до первого запрос завершен. Что мне не хватает?

+2

Вы пытались открыть два браузера вместо двух вкладок? Возможно, браузер использует одно и то же соединение для одного и того же URL-адреса. – Germano

ответ

0

Кажется, я должен был использовать другой браузер или окно инкогнито.

0

@Germano является правильным, это хром имеет то же соединение для одного и того же url.you можно проверить с помощью ниже кода.

#coding:utf8 
from tornado import ioloop 
from tornado import web 
from tornado import gen 

class MainHandler(web.RequestHandler): 

    @gen.coroutine 
    def get(self): 
     client_address = self.request.connection.stream.socket.getpeername() 
     print repr(client_address), 'enter' 
     yield gen.sleep(10) 
     self.write("Hello, world") 
     print repr(client_address), 'leave' 
     self.finish() 

if __name__ == "__main__": 
    application = web.Application([ 
     (r"/", MainHandler), 
    ]) 
    application.listen(8888) 
    ioloop.IOLoop.current().start() 
Смежные вопросы