我担心我发现难以使用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()
有什么想法吗?
答案 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提供了一个兼容层,允许您这样做。