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

Python 龙卷风一个处理程序阻止另一个,python,tornado,Python,Tornado,使用python/tornado,我想建立一个小型“trampoline”服务器,允许两个设备以RESTish方式相互通信。可能有更好/更简单的“现成”方法来实现这一点。我很欢迎这些建议,但我仍然觉得弄清楚如何使用tornado来完成我自己的任务是很有教育意义的 基本上,我的想法是让设备扮演服务器的角色,使用GET进行长轮询。客户端设备将POST发送到服务器,此时POST主体将作为被阻止GET的响应进行传输。在邮报作出回应之前,它会封锁。然后服务器端对响应执行PUT,该响应被传输到阻止的POST

使用python/tornado,我想建立一个小型“trampoline”服务器,允许两个设备以RESTish方式相互通信。可能有更好/更简单的“现成”方法来实现这一点。我很欢迎这些建议,但我仍然觉得弄清楚如何使用tornado来完成我自己的任务是很有教育意义的

基本上,我的想法是让设备扮演服务器的角色,使用GET进行长轮询。客户端设备将POST发送到服务器,此时POST主体将作为被阻止GET的响应进行传输。在邮报作出回应之前,它会封锁。然后服务器端对响应执行PUT,该响应被传输到阻止的POST并返回到设备。我想也许我可以用龙卷风来做这件事。但这似乎没有奏效。我的代码:

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

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

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

为每个请求创建新的
RequestHandler
对象。因此,您需要一些协调器,例如,或与状态对象(在您的情况下,它将重新实现队列)一起使用

tornado.queues
是用于协同路由的队列,返回需要“解决”的未来对象—计划任务成功或异常完成。要等到未来得到解决,您应该
产生它
它(就像在的文档示例中一样)。动词方法也需要修饰为

GET
请求将持续(以非阻塞方式等待),直到队列上有可用的内容(或可定义为
queue.GET
arg的超时)

tornado.queues.Queue
还提供了不必屈服的
get\u nowait
(还有
put\u nowait
),即从队列返回项目或抛出异常

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

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

为每个请求创建新的
RequestHandler
对象。因此,您需要一些协调器,例如,或与状态对象(在您的情况下,它将重新实现队列)一起使用

tornado.queues
是用于协同路由的队列,返回需要“解决”的未来对象—计划任务成功或异常完成。要等到未来得到解决,您应该
产生它
它(就像在的文档示例中一样)。动词方法也需要修饰为

GET
请求将持续(以非阻塞方式等待),直到队列上有可用的内容(或可定义为
queue.GET
arg的超时)


tornado.queues.Queue
还提供了
get_nowait
(还有
put_nowait
)不必屈服-立即从队列中返回项或抛出异常。

我刚刚发现,在debian测试/拉伸上运行,这些都是可用的,因为它有tornado 4.3(队列显然是在4.2中引入的)。但debian stable/jessie上没有这些队列,因为python3 tornado软件包是针对tornado 3.2的。对于旧版本的tornado,有没有一个简单的解决方案?或者我需要弄清楚如何使用更高版本的debian来获取目标机器?有一个
toro
()实际上,该库是在
Tornado.queue
Tornado.locks
:)中合并到Tornado(4.x)中的。我刚刚发现,在debian testing/stretch上运行时,这些都是可用的,因为它有Tornado 4.3(队列显然是在4.2中引入的)。但是debian stable/jessie上没有这些功能,而python3 tornado包是针对tornado 3.2的。对于旧版本的Tornado有没有简单的解决方案?或者我需要弄清楚如何使用更高版本的debian来获取我的目标机器吗?有一个
toro
(),实际上该库在
Tornado.queue
Tornado.locks
:)中被合并到Tornado(4.x)中
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())