首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sockjs-tornado和rpc

Sockjs-tornado和rpc
EN

Stack Overflow用户
提问于 2012-11-13 07:16:54
回答 1查看 731关注 0票数 2

我正在尝试添加一个sockjs-tornado服务器到我的站点,一切正常,直到我决定通过MsgPack (使用msgpack-rpc-python)将它连接到我的其他应用程序。现在可以使用sockjs服务器或者RPC服务器。根据它们中的哪一个从那里开始,首先循环。

我想我需要为这两个都使用一个tornado.ioloop。但是不知道如何实现它。或者,是否有其他方法可以将rpc添加到tornado服务器?

以下是包含msgpack-rpc-python的sockjs-tornado示例代码:

代码语言:javascript
复制
import tornado.ioloop
import tornado.web

import sockjs.tornado

import msgpackrpc

class RPCServer(object):
    def sum(self, x, y):
        return x + y

class IndexHandler(tornado.web.RequestHandler):
    """Regular HTTP handler to serve the chatroom page"""
    def get(self):
        self.render('index.html')

class ChatConnection(sockjs.tornado.SockJSConnection):
    """Chat connection implementation"""
    # Class level variable
    participants = set()

    def on_open(self, info):
        # Send that someone joined
        self.broadcast(self.participants, "Someone joined.")
        # Add client to the clients list
        self.participants.add(self)

    def on_message(self, message):
        # Broadcast message
        self.broadcast(self.participants, message)

    def on_close(self):
        # Remove client from the clients list and broadcast leave message
        self.participants.remove(self)
        self.broadcast(self.participants, "Someone left.")

if __name__ == "__main__":
    # 1. Create chat router
    ChatRouter = sockjs.tornado.SockJSRouter(ChatConnection, '/chat')

    # 1.5 Create MsgPack RPC Server
    rpc = msgpackrpc.Server(RPCServer())

    # 2. Create Tornado application
    app = tornado.web.Application(
            [(r"/", IndexHandler)] + ChatRouter.urls
    )

    # 3. Make Tornado app listen on port 5000
    app.listen(5000)

    # 3.5 Make MsgPack RPC Server listen on port 5001
    rpc.listen(msgpackrpc.Address('localhost', 5001))

    # 4. Start IOLoop
    tornado.ioloop.IOLoop.instance().start()

    # 5. Never executed 
    rpc.start()

`

欢迎任何建议或例子!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-13 19:27:31

这是因为两个Tornado调用都会启动IOLoop,并且直到IOLoop停止时才会退出。

是的,您必须使用一个IOLoop。由于msgpackrpc.Server接受Loop类实例,而Loop封装了IOLoop,请尝试如下所示:

代码语言:javascript
复制
if __name__ == '__main__':
    io_loop = tornado.ioloop.IOLoop.instance()

    loop = msgpackrpc.Loop(io_loop)
    rpc = msgpackrpc.Server(RPCServer(), loop=loop)

    # ... sockjs-tornado initialisation. No need to call rpc.start()

    io_loop.start()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13353214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档