Python Tornado - 异步请求阻塞

MK *_*ung 7 python asynchronous tornado

请求处理程序如下:

class TestHandler(tornado.web.RequestHandler):    #  localhost:8888/test
    @tornado.web.asynchronous
    def get(self):
        t = threading.Thread(target = self.newThread)
        t.start()

    def newThread(self):
        print "new thread called, sleeping"
        time.sleep(10)
        self.write("Awake after 10 seconds!")
        self.finish()

class IndexHandler(tornado.web.RequestHandler):           #   localhost:8888/ 
    def get(self):
        self.write("It is not blocked!")
        self.finish()
Run Code Online (Sandbox Code Playgroud)

当我获取时localhost:8888/test,页面加载10秒并显示Awake after 10 seconds; 在加载时,如果我localhost:8888/index在新的浏览器选项卡中打开,则不会立即阻止和加载新的索引页面.这些符合我的期望.

但是,在/test加载时,如果我/test在新的浏览器选项卡中打开另一个,则会被阻止.第二个/test仅在第一个完成后开始处理.

我在这里犯了什么错误?

dan*_*ano 7

您所看到的实际上是浏览器限制,而不是您的代码问题.我添加了一些额外的日志记录,TestHandler以明确这一点:

class TestHandler(tornado.web.RequestHandler):    #  localhost:8888/test
    @tornado.web.asynchronous
    def get(self):
        print "Thread starting %s" % time.time()
        t = threading.Thread(target = self.newThread)
        t.start()

    def newThread(self):
        print "new thread called, sleeping %s" % time.time()
        time.sleep(10)
        self.write("Awake after 10 seconds!" % time.time())
        self.finish()
Run Code Online (Sandbox Code Playgroud)

如果我同时打开两个curl会话到localhost/test,我在服务器端得到这个:

Thread starting 1402236952.17
new thread called, sleeping 1402236952.17
Thread starting 1402236953.21
new thread called, sleeping 1402236953.21
Run Code Online (Sandbox Code Playgroud)

这在客户端:

Awake after 10 seconds! 1402236962.18
Awake after 10 seconds! 1402236963.22
Run Code Online (Sandbox Code Playgroud)

这正是您的期望.但是在Chromium中,我得到了与你相同的行为.我认为Chromium(可能是所有浏览器)一次只允许一个连接打开到同一个URL.我通过IndexHandler运行相同的代码来确认这一点TestHandler,除了略有不同的日志消息.这是打开两个浏览器窗口时的输出,一个到一个/test,一个到/index:

index Thread starting 1402237590.03
index new thread called, sleeping 1402237590.03
Thread starting 1402237592.19
new thread called, sleeping 1402237592.19
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,两者并发运行没有问题.