2012-09-10 2 views
3

제 문제는 종류가 zmq 소켓을 반쯤 닫으려고하는 것입니다.ZeroMQ 청소 PULL 소켓 - 반 폐쇄

간단히 말해서 나는 PUSH/PULL 소켓을 가지고있다.
는 PUSH 소켓은 결코 전송되지 중지하지만, PULL 소켓은 다음과 같은 방법으로 자신을 정리 할 수 ​​있어야한다 :

  1. 중지 큐
  2. 프로세스 큐
  3. 여전히 메시지에 추가 메시지를 받아들이는
  4. 닫기 소켓 등

다른 PULL 소켓 주위에 제공하거나 이미있을 수 있습니다 때까지, 그것은 자신의 대기열을 축적 유지할 수있는 방법으로 PUSH 소켓에 영향을 미치지 싶지 않아요. LINGER 옵션은 recv() (send())와는 작동하지 않습니다.

브로커 PUSH와 수신자 PULL HWM을 0으로 설정하여 브로커를 가질 수 있습니다. 그런 다음 브로커의 PULL이 메시지를 누적합니다. 그러나, 나는 이것을하지 않을 것입니다. 다른 방법이 있습니까?

답변

0

어떤 소켓 유형이 메시지를 대기시킬 것인지 혼란 스럽습니다. zmq_socket 문서에 따르면 PUSH 소켓은 메시지를 대기열에 넣지 만 PULL 소켓에는 대기열 메커니즘 유형이 없습니다.

그래서 다음 중 어떤 것 할 수 있기를 요구하는지 :

1) PULL 소켓에 추가 메시지를 recv'ing 를 중지합니다. 2) 소켓을 닫습니다.

PUSH 소켓은 HWM이 충족 될 때까지 메시지를 자동으로 '대기열에 넣습니다'(더 이상 메시지를 차단하지 않고 큐에 넣지 않음) 또는 PULL 소켓이 따라옵니다 메시지를 recv'ing 시작합니다.

당신이 정말로 걱정하는 경우는 천천히 당기는 독자입니다. 현재 대기중인 모든 메시지를 PUSH 소켓에 한꺼번에 가져오고 종료하려는 경우? 이것은 zmq가 작동하는 방식이 아니며 한 번에 하나의 메시지 만 얻습니다.

이런 종류의 것을 구현하려면 PULL 기능을 자신의 큐로 포장해야합니다. 멈추고 그 메시지를 처리하고 종료 할 때까지 계속해서 (다른 스레드의 개인 대기열에) 메시지를 가져옵니다.