Twisted API for Couchbase 无法与 Python Tornado 一起使用

Twisted API for Couchbase not working with Python Tornado

我正在尝试 运行 带有 Couchbase 4.0 开发者预览版的 Tornado 服务器。

import tornado.web
import tornado.httpserver
import tornado.options
import tornado.ioloop
import tornado.websocket
import tornado.httpclient
from tornado import gen
import os.path
from tornado.options import define, options, parse_command_line
import time

#from couchbase.bucket import Bucket
from twisted.internet import reactor
from txcouchbase.bucket import Bucket

from couchbase.n1ql import N1QLQuery, N1QLError
from pprint import pprint

server = "x.x.x.x"
bucketname = "zips"

Connection = "couchbase://" + server + "/" + bucketname

bkt = Bucket(Connection)

class IndexHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous   
    def get(self):
        print "entered"
        query = "SELECT * FROM `zips` where pincode= '632014'"
        q = N1QLQuery(query)
        #self.bkt = bkt
        t0 = time.time()
        res = bkt.n1qlQueryAll(q)
        res.addCallback(self.on_ok)
        reactor.run()
        t1 = time.time()
        print t1-t0
        self.write("Hello World")

    def on_ok(self,response):
        print "LOl"
        for each in res:
            print each
        reactor.stop()
        self.finish()

handlers = [
    (r'/',IndexHandler),
]

if __name__ == "__main__":
    parse_command_line()
    # template path should be given here only unlike handlers
    app = tornado.web.Application(handlers, template_path=os.path.join(os.path.dirname(__file__), "templates"),
                                  static_path=os.path.join(os.path.dirname(__file__), "static"), cookie_secret="61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=", debug=True)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(8888, address='0.0.0.0')
    tornado.ioloop.IOLoop.instance().start()

在我 运行 这之后,由于某种原因从未调用回调函数。我找不到任何合适的文档,必须通过源代码来编写它。我仍然很困惑,因为我是异步编程的新手。有人可以告诉我哪里出错了,是否有更好的方法?

在异步编程中,您只想在程序顶部启动一次事件循环(如 IOLoop.start()reactor.run())。您正在调用 IOLoop.start(),因此您想告诉 Twisted 使用 Tornado IOLoop 作为其反应器,而不是调用 reactor.run()。在导入 reactor 之前,执行

import tornado.platform.twisted
tornado.platform.twisted.install()
from twisted.internet import reactor

有关更多信息,请参阅 http://www.tornadoweb.org/en/stable/twisted.html#twisted-on-tornado

完成此操作后,您可以调用扭曲库而无需启动和停止反应器。