龙卷风一个处理程序阻止另一个

时间:2016-06-16 02:53:28

标签: python tornado

使用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服务器的简单/直接用例。我想知道协同程序的东西是否是我需要的,但是没有找到一个很好的教程/例子来帮助我看清楚,如果这确实是要走的路。

1 个答案:

答案 0 :(得分:2)

  

1)一个HTTP动词调用(例如get,put,post,u等)如何阻塞,然后由另一个HTTP动词调用发出信号。

     

2)如何将数据从一个调用共享到另一个?

为每个请求创建新的RequestHandler对象。所以你需要一些协调员,例如具有状态对象的queueslocks(在您的情况下,它将重新实现队列)。

tornado.queues是协同程序的队列。 Queue.getQueue.putQueue.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),不必提供 - 从队列中立即返回项目或抛出异常。

相关问题