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仅在第一个完成后开始处理.
我在这里犯了什么错误?
您所看到的实际上是浏览器限制,而不是您的代码问题.我添加了一些额外的日志记录,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)
正如你所看到的那样,两者并发运行没有问题.
| 归档时间: |
|
| 查看次数: |
1362 次 |
| 最近记录: |