약 10 개의 다른 (센서 읽기) 프로그램에서 정보를 수신하는 프로그램이 있습니다 (모두 스스로 제어). 이제 ZeroMQ를 사용하여 통신하게 만들고 싶습니다 .
대부분의 대기열에서 중요한 것은 중앙 수신 프로그램에 항상 최신 센서 데이터가 있으며 모든 오래된 메시지는 더 이상 중요하지 않다는 것입니다. 몇 개의 메시지가 손실 되어도 상관 없습니다. 그래서 그들 모두를 위해 나는 별도의 PUB/SUB
소켓으로 시작했습니다 . 각 프로그램에 하나씩. 그러나 그것이 올바른 방법인지 확실하지 않습니다. 내가 이해하는 한 두 가지 옵션이 있습니다.
int
.string
받는쪽에 메시지의 내용을 알려줍니다.모든 연결은 PUB/SUB
기본이므로 하나의 소켓을 만드는 것이 좋습니다. 이것이 가장 효율적인 방법인지 확실하지 않습니다.
모든 팁을 환영합니다!
-
PUB/SUB
괜찮 및 N-센서에서 쉽게 변환 할 수 있습니다 : N-센서로 1 로거 : 2 + -loggers
- 하나는 또한 액세스 포트에서 소켓의 개념 분리 혜택을 누릴 수있는 하나 개 이상의 소켓을 얻을 수 있습니다 연결됨
시스템 통합 제약으로 인해 일부 초기 ZeroMQ API에 바인딩되지 않은 경우 메서드 를 통해 정확히 이에 대한 멋진 기능이 있습니다.setsockopt( ZMQ_CONFLATE, True )
.
ZMQ_CONFLATE
: 마지막 메시지 만 유지
설정되면 소켓은 인바운드 / 아웃 바운드 큐에 하나의 메시지 만 유지해야하며이 메시지는 마지막으로 수신 된 메시지 / 마지막 메시지가 전송됩니다.
무시ZMQ_RCVHWM
및ZMQ_SNDHWM
옵션. 않습니다 하지 여러 부분으로 메시지를 지원, 특히, 그것의 한 부분이 소켓 내부 큐에 보관됩니다.
당신의 실시간 제어 안정성을 소개합니다 일부 하드 실시간 제한하지 않는 한, PUB
- 측 자유롭게 결정, 새로운 값을 지시하는 빈도 .send()
에 SUB
(-s)를. 여기에는 마법이 필요하지 않으며, ZMQ_CONFLATE
관리되는 내부 발신 대기열에 대한 옵션 설정 이 적습니다 .
SUB
(-s) 측 수신기 (들)도 도움이됩니다 ZMQ_CONFLATE
관리 내부 수신 큐에 대한 옵션을 설정하지만, 개인의 집합 주어진 .bind()
당신의 "마지막"값 것이다, 다른 개인의 감각 판독의 전달을 위해 별도의 착륙 포트를 인스턴스화 -s 일관되게 "마지막"판독 값을 유지합니다. 모든 판독 값이 공통 랜딩 패드로 이동하면 수신 프로세스가 모든 판독 값을 마스킹 (손실)하게되지만 우연히 "마지막"판독 값이 발생한 바로 전에는 .recv()
그다지 도움이되지 않을 것입니다.
일부 I / O 성능 관련 조정이 필요한 경우 .Context( n_IO_threads )
+ ZMQ_AFFINITY
매핑 옵션이 증가하고 ioDataPump
IO 성능 향상을 위해 활용할 수 있는 리소스의 우선 순위를 지정할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다