2

私は自分のサイトにsockjs-tornadoサーバーを追加しようとしていますが、MsgPackを介して(msgpack-rpc-pythonを使用して)他のアプリに接続することを決定するまで、すべて正常に機能しました。そして今、sockjsサーバーまたはRPCサーバーのどちらかで動作します。それらのどちらから開始するかに応じて、最初にループを開始します。

両方に1つのtornado.ioloopを使用する必要があると思います。しかし、それを達成する方法がわかりません。または、竜巻サーバーにrpcを追加する別の方法があるかもしれませんか?

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

`

どんな提案や例でも大歓迎です!

4

1 に答える 1

1

これは、両方のstart()呼び出しがTornado IOLoopを開始し、IOLoopが停止するまで終了しないために発生します。

はい、1つのIOLoopを使用する必要があります。クラスインスタンスをmsgpackrpc.Server受け入れてカプセル化するので、これを試してください。LoopLoopIOLoop

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()
于 2012-11-13T11:27:31.177 に答える