2012-05-23 1 views
0

Disruptor를 처음 사용했습니다. 다음과 같은 두 가지 쿼리가 있습니다.LMAX의 Disruptor는 공유 변수가있는 다중 생성자와 어떻게 작동합니까?

Q1. one producer to one consumerone producer to multiple dependent consumers의 샘플 코드를 얻었습니다.

여러 소비자의 샘플 코드를 여러 소비자 또는 Sequencer : 3P - 1C에서 얻고 싶습니다. 어떤 블로그 나 코드 샘플을 나에게 소개해 주시겠습니까?

2. 이것은 여러 프로듀서 환경에서 한 프로듀서 결과가 이전 프로듀서의 링 버퍼 결과와 어떻게 관련되는지에 대한 일반적인 질문입니다.

예를 들어 Disruptor는 여러 파일 제작자가 단일 파일/변수를 업데이트하는 환경에서 사용할 수 있습니다. 즉 "Count"라는 이름의 단일 공유 변수를 업데이트하는 두 개의 프로듀서 (P1, P2)가 있습니다 (여기에서 Count는 ValueEvent 클래스의 인스턴스 변수입니다).

처음에는 "count"값이 0입니다.

프로듀서 P1은 "카운트"현재 값으로 1을 더합니다. 따라서 프로듀서 P1이 처리 된 후 카운트 값은 (0 + 1) = 1이됩니다.

프로듀서 P2는 "카운트"현재 값으로 2를 더할 것이기 때문에 프로듀서 P2가 처리 된 후 카운트 값은 (기본적으로, P2는 링 버퍼로부터 업데이트 된 "카운트"값 (P1에 의해 행해진)을 판독하고 증가 된 값 (2)을 추가 할 필요가있다 .2.

우리가 프로듀서의 실행의 순서를 유지할 수 있는가? (P2는 P1 실행 후 항상 수행 할 것이다.)

을 소비자 측에서, 소비자 (C1, C2)을 ((가) "계산"순차적 같은 값을 읽어 1,3, ...,.,.). 이것은 링 버퍼에서와 마찬가지로 각 소비자가 링 버퍼 값을 순차적으로 읽는 것만 큼 좋습니다.

감사합니다. Prasenjit.

답변

0

q1 : 예제가 없습니다.하지만 Java 구현을 사용한다고 가정 할 때 진정으로 독립적 인 여러 제작자가 필요하면 ProducerBarrier를 사용해야합니다.

q2 :하지만 Q2에서는 혼란에 빠진 독립 제작자가 없다고합니다. 종속성 P1이 있고 P2가 {C1, C2}이므로. P2가 다른 변수 (P1 업데이트와 동일한 변수가 아님)를 업데이트하는 "소비자"라고 생각하면 C1 & C2가 P2를 따릅니다.

예를 들어, P1은 count = 0 + 1입니다. P2는 count2 = 1 + 2 = 3입니다. C1 & C2는 "count2"변수를 읽습니다. 그런 다음 P1-> P2-> {C1, C2}가되도록 분쇄기를 설정하십시오. P1이 완료 될 때까지 P2는 처리를 시작하지 않습니다. C1 & C2는 P2가 완료 될 때까지 처리를 시작하지 않습니다.

성능이 최고인 경우 두 카운터 간의 캐시 라인 공유에주의해야합니다.

0
  1. 여러 프로듀서 - 단일 소비자를 설명하기위한 샘플 프로젝트를 작성했습니다. 이 http://krishnansrinivasan.wordpress.com/2012/07/29/using-disruptor-net-with-wcf-2/

  2. 생산자 RingBuffer에 의해 추출 된 변수의 상태를 업데이트하지 : 다음은 링크입니다.Ringbuffer는 생산자로부터 메시지를받는 순서에 따라 소비자에 대한 호출을 엄격하게 시퀀싱하는 데 도움이됩니다.