2012-07-20 6 views
1

다른 유형의 out-of-process 메시지를받는 알고리즘을 실행합니다. 들어오는 메시지는 실제로 바이트 배열이고 각 바이트 배열은 메시지 유형을 나타내는 바이트 배열 플래그에 의해 미리 보류됩니다. 들어오는 바이트 배열을 처리하는 IPropagator<byte[], byte[]>을 설정하고 바이트 배열 플래그를 해석 한 다음 바이트 배열을 연결된 해당 ActionBlock에 스트리밍하도록 설정할 수 있는지를 알고 싶습니다.TPL 데이터 흐름 메시지 유형 할당 패턴이 가능합니까?

예를 들어, 내가 2 개의 다른 메시지 유형을 갖고 있고, 2 개의 서로 다른 ActionBlocks가 수신해야하는 메시지 유형과 일치하는 메시지 만 수신한다고 가정 해 보겠습니다. 두 액션 블록에 IPropagatorBlock을 연결하면 둘 다 ActionBlocks가 같은 메시지를 받겠습니까? 플래그에 따라 각 메시지를 올바르게 할당하려면 어떻게해야합니까 (플래그에 대해 걱정할 필요가 없습니다. 식별은 쉽지 않습니다. 언제든지 ActionBlock IPropgatorBlock이 메시지를 스트리밍하려고합니다). 데이터 흐름 구조를 올바르게 설정하는 데 어려움을 겪고 있습니다. Post()하는 대신 데이터 블록을 서로 직접 연결할 수 있기를 바랍니다. 그게 가능하니?

그 점에 대해 도움을 주시면 감사하겠습니다.

답변

1

이것은 사용중인 IPropagatorBlock에 따라 다릅니다. 사용자 지정 항목 인 경우 링크 된 순서 (또는 더 안정적인 항목)에 따라 사용할 대상 블록을 인식하는 등의 작업을 수행 할 수 있습니다.

그러나 블록을 가정하는 것은 실제로 정상 TransformBlock (또는 같은), 나는 최선의 선택이 the overload of LinkTo() that takes a predicate을 사용하는 것입니다 생각하고 IPropagatorBlock<byte[], Tuple<FlagType, byte[]>>에 블록의 유형을 변경하는 것을 의미한다 (출력 유형에 플래그를 추가, 또는 Tuple 대신 사용자 정의 유형). 이를 수행하면 해당 대상에 대한 술어가 메시지와 일치하는 경우에만 대상이 메시지를 수신하게됩니다.

원본 블록에 따라 하나의 원본 블록을 다른 대상 블록에 연결하면 어떻게됩니까? 대부분의 경우 각 메시지를 정확하게 하나의 대상으로 보냅니다. 첫 번째 대상을 먼저 시도하고 첫 번째 대상이 거부되거나 메시지를 연기하는 경우 두 번째 대상을 시도합니다. 이 규칙의 예외는 항상 BroadcastBlock (및 이와 유사한 WriteOnceBlock)이며 모든 메시지를 항상 모든 대상으로 보내려고합니다. 다시 한 번, 사용자 정의 블록은 원하는대로 작동 할 수 있습니다.

+0

필자는 직접 테스트 할 것이지만 프리디 케이트/필터를 사용하는 방법이 변환 블록 내에서 수동으로 할당을 수행 한 다음 플래그가 무엇인지에 따라 단순히 Actionblocks에 게시하는 것이 얼마나 빠른지 알 수 있습니다. (분명히 변환 블록이 필요하지 않지만 다른 액션 블럭에 게시하는 액션 블럭이 될 것입니다. 분명히 가장 좋은 방법은 아니지만, 술어를 사용하는 것보다 빠르거나 느릴 것이라고 생각합니까? –

+0

저는 술어를 사용하면 성능이 매우 낮을 것이라고 생각합니다. 당신은 많은 표적을 가지고 있습니다, 그리고 나서 정확한 표적에 대한 선형 탐색은 문제가 될 수 있습니다. 그러나 그것은 당신의 경우가 아닙니다. – svick

+0

나는 그것을 시험해 보았습니다 : 매끈한 해결책과 매우 빠릅니다. ZeroMQ를 메시징 시스템으로 사용하여 들어오는 메시지가 있기 때문에 질문을합니다. 하나만 들어오는 소켓이 있고 처리를 위해 각 메시지 블록을 각각의 작업 블록에 할당하거나 각 메시지 유형에 대한 소켓을 설정하고 많은 메시지를 작성해야합니다. 이벤트 처리기를 작성하고 이벤트를 다른 클래스에 전달하는 코드. 어쨌든 동시에 처리하기 때문에이 접근 방식을 사용하는 것이 좋습니다. –