使用python / tornado我想设置一个" trampoline"允许两个设备以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)如何将数据从一个调用共享到另一个?
我只是真正抓住了使用龙卷风制作小型REST服务器的简单/直接用例。我想知道协同程序的东西是否是我需要的,但是没有找到一个很好的教程/例子来帮助我看清楚,如果这确实是要走的路。
答案 0 :(得分:2)
1)一个HTTP动词调用(例如get,put,post,u等)如何阻塞,然后由另一个HTTP动词调用发出信号。
2)如何将数据从一个调用共享到另一个?
为每个请求创建新的RequestHandler
对象。所以你需要一些协调员,例如具有状态对象的queues
或locks
(在您的情况下,它将重新实现队列)。
tornado.queues
是协同程序的队列。 Queue.get
,Queue.put
,Queue.join
返回Future对象,需要"已解决" - 计划任务完成或成功。要等到将来解决,您应该yielded
它(就像在tornado.queues
的文档示例中一样)。动词方法也需要用tornado.gen.coroutine
进行修饰。
import tornado.gen
class Query(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
toServer = yield ToServerQueue.get()
self.write(toServer)
@tornado.gen.coroutine
def post(self):
toServer = self.request.body
yield ToServerQueue.put(toServer)
toClient = yield ToClientQueue.get()
self.write(toClient)
@tornado.gen.coroutine
def put(self):
yield ToClientQueue.put(self.request.body)
self.write(bytes())
GET
请求将持续(以非阻塞方式等待),直到队列中的某些内容可用(或者可以定义为Queue.get
arg的超时)。
tornado.queues.Queue
还提供get_nowait
(还有put_nowait
),不必提供 - 从队列中立即返回项目或抛出异常。