2010-02-01 3 views
8

F #이 나오면 비동기/병렬 프로그래밍 영역에 재물이 생길 것입니다. answer to this question은 Tasks, Parallel LINQ 및 Reactive Framework 간의 차이점을 설명하는 데 상당히 도움이되지만, 비동기 워크 플로가 어떻게 그림에 정확하게 들어 있는지 궁금합니다.F # : Asynch and Tasks and PLINQ, 이런!

제가 틀렸다면 제발 정정 해주십시오.하지만 asynch workflow가 IO 바인딩 작업, 특히 AsynchXxx 메서드가 정의 된 작업을 수행하는 가장 쉬운 방법이되거나 BeginXxx/EndXxx 무늬. 또 다른 장점은 비동기 워크 플로를 구성 할 수 있으며 다른 asynch 워크 플로를 통해 구축 할 수 있다는 점입니다. 이는 프로그램 구성 방식의 유연성을 크게 높일 수 있습니다.

내가 도움이 필요한 것은 F # 코드에서 비동기 워크 플로우에 대한 작업 또는 PLINQ를 어떤 상황에서 선택하는지 이해하는 것입니다. 필자는 작업 병렬 라이브러리가 코어를 통한로드 균형을 조정하는보다 정교한 방법을 가지고 있다고 읽었습니다. 그것이 사실이라면, 작업은 병렬로 작동해야하는 순수한 CPU 바운드 작업에 더 나은 선택 일 수 있습니다. 반면 PLINQ는 주로 시퀀스와 함께 작동하는 기존 코드를 병렬화하는 편리한 방법 인 것으로 보입니다.

마지막으로, 각 방법의 강점에 대한 나의 이해가 맞다면, 그것을 결합하는 것이 항상 가능할까요? 예를 들어 비동기 워크 플로에서 일련의 작업을 작성한 다음 실행 전에 작업으로 변환 할 수 있습니다. 그게 가능하다면 - 또는 좋은 아이디어.

+0

흠, Async.StartAsTask와 Async.AwaitTask로 뭔가를 할 수 있다고 확신합니다. – gradbot

답변

12

Task Parallel Library vs Async Workflows을 참조하십시오. 다음과 같이

나는 기초를 요약 한 것입니다 :

작업 병렬 라이브러리 : 작업의 여러 단위가 병렬 유사한 계산을 수행하는 여러 스레드를 산란과 같은 비교적 단순한 시나리오를 포함하여 여러 개의 코어에 효율적으로 실행할 수 있습니다 계산 자체가 추가 작업을 생성하는 복잡한 작업은 물론 복잡합니다. 향상된 .NET 4.0 스레드 풀과 작업 대기열을 사용하여 모든 코어가 사용 중인지 확인합니다.

비동기 워크 플로 : 불필요한 스레드를 차지하지 않고 비동기 계산을 실행하고 결과를 사용할 수있을 때 콜백을 시작할 수 있습니다.

PLINQ : 예를 들어, 병렬 데이터의 배열의 각 항목에 대해 하나의 동작을하고 (코드 PLINQ는 TPL 통해 실행 끝나하여 작성된 있지만 쉽게 LINQ 쿼리를 사용하여 표현되는 코드에 대한 더 좋은 인터페이스).비동기 워크 플로우가 StartAsTask 방법을 사용하여 작업으로 변환 할 수 있으며, 작업이 Async.AwaitTask 방법을 사용하여 Async들로 변환 할 수 있습니다, 그래서 그들은 약간 다른 대상 시나리오를 목표 않지만 그것이 기술을 해소 할 수 있다는

참고.

저에게있어서, 다른 스레드에서 많은 계산 작업을 수행하고 있다면 PLINQ 나 PSeq 모듈과 같은 F #을 사용하여 TPL을 사용하고 싶을 것입니다. IO (병렬 또는 비 병렬)를 많이 사용하려는 경우 asynch 워크 플로를 사용해야합니다. raytracer는 TPL을 사용하여 각 픽셀 (또는 스캔 라인)을 병렬로 렌더링하는 작업을 시작하여 컴퓨터에서 사용 가능한 컴퓨팅 성능을 극대화합니다. 그러나 코어 사이에 퍼지기위한 계산량이 많지 않으므로 비동기 워크 플로를 사용하여 많은 웹 페이지를 다운로드해야합니다. 결과가 왔을 때 운영체제에 통보하면됩니다.

+0

흥미 롭습니다. 고맙습니다. 따라서 많은 웹 페이지를 다운로드하여 데이터를 기반으로 레이 트레이서를 시작하는 합리적인 이유가 있다면 비동기 단계 뒤에 작업 단계를 추가하거나 StartAsTask를 사용하여 비동기 호출을 수행 한 다음 더 많은 작업을 생성하는 작업으로 비동기 호출이 발생합니까? –

+0

@Joel : 어떤 옵션이 더 잘 작동하는지 보려면 각 옵션을 프로파일 링 해 두는 것이 좋습니다. 궁극적으로 모든 작업이 동일한 스레드 풀에서 실행되기 때문에 다른 async 블록에서 왔는지 여부는 중요하지 않습니다. 실제로는 개인적인 취향입니다. 동시에, 필자가 놓치고있는 일종의 미묘한 상호 작용이있을 수 있으므로 두 경우 모두 시도해 볼 가치가 있습니다. – kvb

1

비동기 작업 흐름은 F # 모나 딕 구문을 통해 구현됩니다. 즉, 워크 플로우를 작업으로 변환하는 대신 병렬 작업 라이브러리를 기반으로하는 "비동기"버전을 작성할 수 있습니다. 나는 다음과 같은 몇 가지주의 사항으로이를 말하고있다.

  • 어려운 일이다.
  • .NET에서 BeginXxx/EndXxx 패턴을 사용하는 비동기 작업은 스레드 풀에 콜백을 등록합니다. 나는 당신이 이것을 바꿀 수 있는지 확신하지 못한다.

F #에서 모나드를 구현하는 방법에 대한 자세한 내용은 "전문가 F #"또는 Google에서 "F # monads"를 약간 참조하십시오.

내가 아는 완전한 대답은 아니지만 조금 도움이 되었기를 바랍니다.

+0

비동기 워크 플로와 작업. 알아 둘만한. 누구든지 비동기 워크 플로 대신 작업을 사용하는 방법을 알 수있는 의견을 갖고 있습니까? –

+0

사실은 멀리 사이에 변환하는 것입니다, @ kvb 대답을 참조하십시오. 더 많은 일러스트레이션에 대한 나의 대답은 당신이 실험하고 싶다면 할 수있는 일이다. – Robert