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