2014-05-10 2 views
0

토네이도의 8 인스턴스 앞에 nginx가 있고 일부 요청 (메모 처리기)에 대해 ZeroMQ에서 메시지를 보내려면 Tornado가 필요합니다.처리기가 실행될 때마다 zeromq에 메시지를 밀어 넣어야합니다.

# here is body of handler for comments 

    context = zmq.Context() 
    port = "5252" 
    socket = context.socket(zmq.PUSH) 
    socket.bind("tcp://*:%s" % port) 
    print "Running server on port: ", port 
    socket.send("Commented") 

    # here I flush response to client 

하지만이 걸려 : 나는 핸들러의 끝에서이 일을하고 (그냥 클라이언트에 응답을 전송하기 전에). 핸들러가 실행될 때마다 ZeroMQ로 푸시하는 것이 진정한 방법입니까?

답변

0

핸들러가 실행될 때마다 이것을 ZeroMQ로 밀어 넣는 것이 진짜 방법입니까?

번호 귀하의 코드는 요청 핸들러가 호출 될 때마다 zmq.Context()를 호출합니다. 이것은 나쁘다. 이 함수는 정확히 한 번 호출해야합니다. 일반적으로 프로세스 초기에, 일종의 init 처리기에서 호출해야합니다. 임의의 수의 스레드간에 컨텍스트 인스턴스를 안전하게 공유 할 수 있습니다.

소켓 만들기 및 바인딩과 동일한 작업 - 시작시 한 번 수행해야합니다. 소켓을 더 조심해야합니다. 모든 핸들러 (응용 프로그램, 요청 등)가 핸들러가 호출 될 때마다 동일한 스레드에서 실행중인 경우 동일한 소켓을 사용할 수 있습니다.

또 다른 문제는 PUSH 소켓에 "보내는"방법입니다. http://api.zeromq.org/3-2:zmq-socket에 설명 된대로 PUSH 소켓으로 보내기는 특정 상황에서 차단 될 수 있으며이를 피하기를 원할 것입니다. POLLOUT 플래그 (및 0 시간 초과)와 함께 zmq.Poller를 사용하여 송신이 차단되는지 판별하십시오. 그렇지 않다면 바로 보내십시오. 그렇다면 나중에 다시 시도하기 위해 메시지를 삭제하거나 응용 프로그램에 저장할지 여부를 결정해야합니다.

관련 문제