龙卷风adbapi回调没有运行

时间:2014-03-10 19:12:23

标签: python asynchronous twisted tornado deferred

我担心我发现难以使用adbapi接口来处理扭曲的sqlite3 ConnectionPools。

我已经在我命名为db.py的文件中初始化了我的池:

from twisted.enterprise import adbapi 

pool = adbapi.ConnectionPool("sqlite3", db=config.db_file)
pool.start()


def last(datatype, n):
    cmd = "SELECT * FROM %s ORDER BY Timestamp DESC LIMIT %i" % (datatype, n)
    return pool.runQuery(cmd)

然后,我正在导入db.py并在特定的路由处理程序中使用它。不幸的是,似乎永远不会触发回调。打印datatype,但永远不会打印response

class DataHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self, datatype):
        print datatype
        data = db.last(datatype, 500)
        data.addCallback(self.on_response)

    def on_response(self, response):
        print response
        self.write(json.dumps(response))
        self.finish()

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

混合龙卷风和扭曲需要特别注意。试试这个,作为整个程序中执行的第一行:

import tornado.platform.twisted
tornado.platform.twisted.install()

然后,启动服务器:

tornado.ioloop.IOLoop.current().start()

现在发生的事情是,你启动Tornado IOLoop,但你从未启动Twisted Reactor。 运行查询时,Twisted SQLite连接会启动IO操作,但由于Reactor未运行,因此操作永远不会完成。为了让IOLoop和Reactor共享您的流程,您必须将其中一个运行在另一个之上。 Tornado提供了一个兼容层,允许您这样做。