第1个龙卷风处理程序

2024-09-25 06:22:09 发布

您现在位置:Python中文网/ 问答频道 /正文

使用python/tornado,我想建立一个小的“蹦床”服务器,允许两个设备以RESTish的方式相互通信。可能有更优越/更简单的“现成”方法。我很欢迎这些建议,但我仍然觉得找出如何使用龙卷风来实现我自己的目标是很有教育意义的。在

基本上,我的想法是让设备扮演服务器的角色,使用GET进行longpoll。客户机设备将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()在队列有项之前不会真正阻塞,而是返回一个龙卷风。并发。未来. 它不是要传递给self.write()调用的合法值。在

我想我的问题有两个:

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

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

我只讨论了用tornado制作小型REST服务器的简单/直接的用例。我想知道协同程序的东西是否是我所需要的,但是还没有找到一个好的教程/例子来帮助我看到光明,如果这真的是这样的话。在


Tags: importself服务器webgetputdefpost
1条回答
网友
1楼 · 发布于 2024-09-25 06:22:09

1) How can one HTTP verb invocation (e.g. get, put, post,u ne etc) block and then be signaled by another HTTP verb invocation.

2) How can I share data from one invocation to another?

为每个请求创建新的RequestHandler对象。{or你需要实现{a2}的对象{a2。在

tornado.queues是协同路由的队列。^{}^{}^{}返回需要“解析”的未来对象-计划任务成功或异常完成。要等到future被解析,您应该yielded它(就像^{}的doc示例一样)。动词方法还需要用^{}修饰。在

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.getarg的超时)。在

tornado.queues.Queue还提供了get_nowait(也有put_nowait)不必获得-立即从队列返回项或引发异常。在

相关问题 更多 >