【发布时间】:2016-06-16 02:53:28
【问题描述】:
我想使用 python/tornado 设置一个小型“蹦床”服务器,允许两个设备以 REST 方式相互通信。可能有更好/更简单的“现成”方法来做到这一点。我欢迎这些建议,但我仍然觉得弄清楚如何自己使用龙卷风是很有教育意义的。
基本上,我的想法是让设备扮演服务器角色,使用 GET 进行长轮询。客户端设备将 POST 到服务器,此时 POST 正文将作为被阻止的 GET 的响应传输。在 POST 响应之前,它会阻塞。然后服务器端对响应执行 PUT,该响应被传输到被阻止的 POST 并返回到设备。我想也许我可以用 tornado.queues 做到这一点。但这似乎没有奏效。我的代码:
import tornado
import tornado.web
import tornado.httpserver
import tornado.queues
ToServerQueue = tornado.queues.Queue()
ToClientQueue = tornado.queues.Queue()
class Query(tornado.web.RequestHandler):
def get(self):
toServer = ToServerQueue.get()
self.write(toServer)
def post(self):
toServer = self.request.body
ToServerQueue.put(toServer)
toClient = ToClientQueue.get()
self.write(toClient)
def put(self):
ToClientQueue.put(self.request.body)
self.write(bytes())
services = tornado.web.Application([(r'/query', Query)], debug=True)
services.listen(49009)
tornado.ioloop.IOLoop.instance().start()
不幸的是,ToServerQueue.get() 在队列有项目之前实际上并没有阻塞,而是返回一个 tornado.concurrent.Future。这不是传递给self.write() 调用的合法值。
我想我的一般问题是双重的:
1) 一个 HTTP 动词调用(例如 get、put、post 等)如何阻塞,然后由另一个 HTTP 动词调用发出信号。
2) 如何将数据从一个调用共享到另一个调用?
我只真正触及了使用 tornado 制作小型 REST 服务器的简单/直接用例。我想知道协程的东西是否是我需要的,但还没有找到一个好的教程/示例来帮助我看到光明,如果这确实是要走的路。
【问题讨论】: