문제

C#에 동시 코드를 실행하여 작업 병렬 라이브러리 (작업 및 향후 연속 체인)를 많이 사용하는 몇 가지 사항이 있습니다.

나는 지금 이것을 f#로 포팅하고 있으며 tpl의 구조물과 f# async 워크 플로를 사용하는 장단점을 알아 내려고 노력하고 있습니다. 나는 tpl에 기대고 있지만 어느 쪽이든 할 수 있다고 생각합니다.

공유 할 동시 프로그램을 작성하는 것에 대한 팁과 지혜가 있습니까?

도움이 되었습니까?

해결책

이름은 그 차이를 거의 요약합니다. 비동기 프로그래밍 대 평행한 프로그램 작성. 그러나 F#에서는 혼합 및 일치 할 수 있습니다.

F# 비동기 워크 플로우

F# Async 워크 플로우는 코드가 비동기 적으로 실행되도록 할 때 도움이됩니다. 이는 작업을 시작하고 최종 결과를 기다리지 않습니다. 이것의 가장 일반적인 사용법은 IO 작업입니다. 당신의 스레드가 당신의 하드 디스크가 낭비되는 자원을 완료하기를 기다리는 유휴 루프에 당신의 스레드를 거기에 두는 것.

쓰기 작업을 비동기로 시작하면 스레드를 중단하고 하드웨어 인터럽트로 나중에 깨울 수 있습니다.

작업 병렬 라이브러리

.NET 4.0의 작업 병렬 라이브러리는 MP3를 디코딩하거나 데이터베이스에서 일부 결과를 읽는 것과 같은 작업의 개념을 초록합니다. 이러한 상황에서는 실제로 계산 결과를 원하고 어느 시점에서 나중에 작업 결과를 기다리고 있습니다. (.Result 속성에 액세스함으로써.)

이 개념을 쉽게 혼합하고 일치시킬 수 있습니다. TPL 작업 객체에서 모든 IO 작업을 수행하는 것과 같은. 프로그래머에게 당신은 그 여분의 스레드를 '다루어야'할 필요성을 추상화했지만 덮개 아래에서 자원을 낭비하고 있습니다.

현명한 것처럼 일련의 F# async 워크 플로를 만들어 병렬로 실행할 수 있지만 (async.parallel) 최종 결과를 기다려야합니다 (async.runsynchronously). 이렇게하면 모든 작업을 명시 적으로 시작할 필요가 없지만 실제로 계산을 병렬로 수행하고 있습니다.

내 경험상 TPL은 일반적으로 N 작업을 병렬로 실행하고 싶기 때문에 TPL이 더 유용하다는 것을 알게됩니다. 그러나 F# Async 워크 플로는 반응 에이전트 또는 사서함 유형과 같은 '장면 뒤에'진행되는 것이있을 때 이상적입니다. (메시지를 보내서 메시지를 처리하고 다시 보냅니다.)

도움이되기를 바랍니다.

다른 팁

4.0에서 나는 다음과 같이 말할 것이다.

  • 기능이 순차적 인 경우 비동기 워크 플로우를 사용하십시오. 그들은 단순히 더 잘 읽습니다.
  • 다른 모든 것에 tpl을 사용하십시오.

믹스 앤 일치도 가능합니다. 그들은 작업 플로우를 작업으로 실행하고 비동기 시작/끝 패턴을 따르는 작업을 작성하는 데 대한 지원을 추가했습니다. TaskFactory.fromasync, tpl은 Async.frombeginend 또는 Async.BuildPrimitive.

let func() =
    let file = File.OpenRead("foo")
    let buffer = Array.zeroCreate 1024
    let task1 = Task.Factory.FromAsync(file.BeginRead(buffer, 0, buffer.Length, null, null), file.EndRead)
    task1.Start()

    let task2 = Async.StartAsTask(file.AsyncRead(1024))
    printfn "%d" task2.Result.Length

또한 비동기 워크 플로우 런타임과 TPL은 추가 커널 프리미티브 (이벤트)를 생성하고 사용한다는 점도 주목할 가치가 있습니다. WaitformultipleObjects 완료 포트 및 콜백을 사용하지 않고 I/O 완료를 추적합니다. 이것은 일부 응용 프로그램에서 바람직하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top