2013-04-04 1 views
2

긴 파일 바인딩 작업의 병렬 처리를 처리하기 위해 Rx 확장을 사용하고 싶습니다.동일한 스레드에서 동일한 드라이브의 파일 작업을 배치 할 수있는 스레드 스케줄러?

워크 플로는이 라인을 따라 뭔가 : 여러 드라이브에 지정된 파일 패턴을 발견 일치하는 각 파일에 대한

  • (의 각 드라이브는 별도의 물리적 장치에 가정하자)에 대한

    • 검색의 대기열 긴 파일 작업 은 동일한 드라이브에있는 다른 파일과 동일한 스레드로 - 무작위 탐색을 최소화하십시오.
    • 다른 드라이브에있는 파일에 대한 작업은 병렬 처리가 가능하도록 다른 스레드에 대기되어야합니다.

    내 질문은 : 어떤 Rx 스케줄러 (또는 스케줄러 조합)를 사용해야합니까?

  • 답변

    6

    이렇게하려면 각 Rx 관찰 가능 구독이 연속적으로 작동한다는 것을 깨닫는 것이 매우 유용합니다. 즉, 하나의 관찰 가능 항목을 한 번 구독하면 다음 항목에 대한 onNext이 시작되기 전에 한 항목의 onNext 대리인이 완료되었는지 확인할 수 있습니다.

    기본적으로 onNext 대리자는 현재 스레드 (즉 OnNext()을 호출하는 스레드)에서 실행되지만 ObserveOn()을 사용하여 변경할 수 있습니다.

    이것이 의미하는 바는 각각의 물리적 드라이브에 대해 별도의 관찰 가능을 작성하고 각각의 개별 스레드에서 관찰 할 수 있어야한다는 것입니다. 이를 수행하는 한 가지 방법은 실행 작업을 관찰 할 수있는 유일한 작업이있는 경우 GroupBy()을 사용하는 것입니다.

    사용할 특정 스케줄러는 무엇입니까? 나는 그것이별로 중요하지 않다고 생각한다. ObserveOn()은 사용 가능한 경우 ScheduleLongRunning()을 사용하는 것으로 보입니다. 가장 일반적인 스케줄러의 경우 관찰을 위해 새 스레드를 생성한다는 의미입니다.

    operations.GroupBy(op => op.Drive) 
          .Select(o => o.ObserveOn(TaskPoolScheduler.Default)) 
          .Do(o => o.Subscribe(op => op.Execute())) 
          .Subscribe(); 
    

    (. operations 가정하면 Drive 재산과 Execute() 방법을 가지고 당신의 작업 유형의 관측)

    :처럼 모든 것을 함께, 코드를 볼 수있는 일을 퍼팅

    관련 문제