3

我正在尝试使用 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()

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

4

1 回答 1

2

在异步编程中,您只想在程序顶部启动一次事件循环(如IOLoop.start()或)。reactor.run()您正在呼叫IOLoop.start(),因此reactor.run()您不想呼叫,而是要告诉 Twisted 使用 Tornado IOLoop 作为其反应器。在导入之前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

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

于 2015-07-16T03:00:44.613 回答