python - Sockjs-tornado 和 rpc

标签 python rpc tornado msgpack sockjs

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

我认为我需要为它们都使用一个 tornado.ioloop。但不知道如何实现它。或者可能有另一种方法可以将 rpc 添加到 Tornado 服务器?

这是带有 msgpack-rpc-python 的 sockjs-tornado 示例代码:

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()

`

欢迎提出任何建议或示例!

最佳答案

发生这种情况是因为 start() 调用都启动了 Tornado IOLoop,并且在 IOLoop 停止之前它们不会退出。

是的,你必须使用一个 IOLoop。由于 msgpackrpc.Server 接受 Loop 类实例并且 Loop 封装了 IOLoop,试试这个:

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()

关于python - Sockjs-tornado 和 rpc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13353214/

相关文章:

python - OpenERP : fetch record with same name

Discord 进程间通信 - 读取消息

python - vlc mac python 绑定(bind)视频输出和 vlc.py 的位置

python - 如何解决Python中 float 的表示错误?

json - JSON REST/RPC 接口(interface)的 IDL

php - RPC w/PHP - 与传输机制无关

python - 如何修复 Python 中的 'Install tornado itself to use zmq with the tornado IOLoop.' 警告

python - 用 Tornado 处理标准输入

python - Tornado +桃子。不断增长的响应时间

python - 是否有 Django 函数可以对 None 对象进行对象计数?