Tornado:在异步处理器中进行阻塞HTTP请求
我正在尝试用Tornado写一个应用程序,当收到一个包含类别的POST请求时,它会调用一个函数,这个函数会对存储在CouchDB数据库中的一系列RSS源进行(阻塞的)HTTP请求,然后对数据进行一些排序,最后将结果以字典的形式返回给Tornado的异步请求处理器。目前来看,第一次用户访问时似乎运行得还不错。
但是在第二次向同一页面发送POST请求时,结果经常会把来自多个类别的结果混合在一起,感觉每个类别的函数调用好像被合并了。我对事件驱动编程还很陌生,不知道为什么会这样。这让事情变得很麻烦,因为用户点击一个类别时却得到了两个类别的结果。
这里有个结构图:
Calls: Tornado Async Handler -> get_data(category) -> RSS_handler(RSS_feed)
Returns: self.write(data) <- more_data <- some_data
有没有人知道为什么这些调用会被合并?我的RSS处理类在它的init函数中清空了所有成员变量,处理数据的get_data函数也是这样。
(本来想贴代码的,但代码太多了,没法在这里全部粘贴,而且我也不知道是哪一行导致的问题)
1 个回答
1
没有更多的细节,很难给出答案。听起来像是使用全局变量或者类似的问题。解决这类问题的一个好方法是在每次修改数据之前和之后添加一些日志记录。
在命令行中用 --logging=debug
启动你的tornado应用,这样可以开启调试级别的日志记录。然后添加日志记录,帮助你找到额外数据是在哪里被添加的。
import logging
...
def on_response(self, response):
logging.debug(response)
self.write(response.body)