2012-11-12 3 views
2

나는 내 사이트에 sockjs 토네이도 서버를 추가하기 위해 노력하고있어, 나는 (msgpack-RPC-파이썬을 사용하여) MsgPack를 통해 내 다른 응용 프로그램에 연결하기로 결정 때까지 모든 괜찮 았는데. 그리고 이제 sockjs 서버 나 RPC 서버 중 하나를 작동시킵니다. 그들 중 어느 쪽에서 시작 하느냐에 따라 먼저 루프가 반복됩니다.Sockjs 토네이도 및 RPC

나는 내가 그들 모두에 대해 하나의 tornado.ioloop를 사용할 필요가 있다고 생각합니다. 그러나 그것을 성취 할 수있는 방법을 모르십시오. 아니면 토네이도 서버에 RPC를 추가하는 또 다른 방법이 될 수있다? 어떤 제안이나 예

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

`

환영합니다 :

여기

는 msgpack-RPC-파이썬과 sockjs 토네이도 샘플 코드입니다! IOLoop이 중지 될 때까지 모두 start() 통화 토네이도 IOLoop를 시작하고 그들이 종료하지 않기 때문에

답변

1

이 발생합니다.

예, 하나 IOLoop를 사용해야합니다. msgpackrpc.ServerLoop 클래스 인스턴스 및 Loop incapsulates 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() 
+0

을! 매력처럼 작동하십시오. 많은 감사합니다! – Jerry92