2014-12-26 4 views
0

저는 F # 동시성의 중요한 기능인 F # 비동기 워크 플로를 최근에 배웠습니다. 필자는 F #에서 동시 코드를 작성하는 방법이 얼마나 많은지 혼란 스럽습니다. F #을 제외하고 F # 동시성에 대한 블로그를 읽었습니다. 배경 작업자와 같은 것을 알고 있습니다. IAsyncResult; 로컬 컴퓨터에서 프로그래밍하는 경우 F #에 샤드 메모리 동시성이 있습니다. 분산 시스템에서 프로그래밍하는 경우 메시지 전달 동시성이 있습니다. 그러나 나는이 기술들 사이의 관계가 무엇인지, 그것들을 어떻게 분류하는지에 대해 정말로 확신하지 못합니다. 나는 하나의 문장이나 두 문장으로 대답 할 수없는 "큰"질문이라는 것을 이해합니다. 누군가가 저에게 특정한 답을 주거나 유용한 참고 문헌을 추천 해 주시면 감사하겠습니다.F # 동시성의 다른 접근 방식 사이의 관계는 무엇입니까

답변

0

또한 F 번호에 오히려 새로운, 그래서 나는 더 많은 답변을 보완하기 위해 올 희망이 하나 :

첫 번째 것은 당신이 어떤에서 사용할 수있는 .NET 사이의 클래스을 (구별 할 필요가있다 .NET 언어) 및 F # 고유 한 방법 비동기 작업을 처리 할 수 ​​있습니다. 이것은 윈도우 폼을 가진 첫번째 .NET 버전에서 주로 사용되었고 그것은 더 이상하지 않는 것이 좋습니다 :

  • System.ComponentModel.BackgroundWorker를 : 첫 번째 경우에는 당신이 언급로하고 다른 사람의 사이에서, 당신은.

  • System.IAsyncResult : 이것은 여러 클래스 (Task)에서도 구현되는 오래된 .NET 인터페이스이지만 일반적으로 직접 사용하지는 않습니다.

  • Windows.Foundation.IAsyncOperation : 다른 인터페이스이지만 Windows Store 앱에서만 사용됩니다. 대부분의 경우 작업을 직접 Task로 변환하므로 걱정할 필요가 없습니다.

  • System.Threading.Tasks.Task : 이제 .NET 비동기 및 병렬 (병렬 작업 라이브러리와 함께) 작업을 처리하는 데 권장되는 방법입니다. 이것은 C# async/키워드를 기다리는 숨겨진 힘입니다.이 키워드는 작업에 연속성을 전달하는 구문적인 설탕입니다.


그래서 지금 F 번호 독특한 방식과 : 비동기 워크 플로우MailboxProcessor. 후자는 동시성을 다루는 반면, 전자는 병렬 처리에 해당한다고 대략 말할 수 있습니다.

  • Asynchronous Workflows : 비동기 처리 할 일이 단지 계산 식 (일명 모나드) : UI 스레드를 차단 방지하기 위해 백그라운드에서 실행 작업 또는 병렬 작업은 멀티 코어에서 최대의 성능을 얻을 수 있습니다 시스템.

    C# async/await와 동등하지만 F # 팬들은 좀 더 포괄적이고 유연한 메커니즘 (계산식)을 사용하기 때문에 더욱 세련된 솔루션이라고 생각하고 싶습니다. asynchronous sequences, events 또는 심지어 Javascript callbacks. 또한 Thomas Petricek이 설명한대로 here과 같은 다른 장점이 있습니다.

    대부분의 경우 비동기 워크 플로 내에서 Control.Async의 메서드 또는 F # 핵심 라이브러리의 .NET 클래스 (예 : WebRequest.AsyncGetResponse)의 확장을 사용하게됩니다.필요한 경우 .NET 작업 (Async.AwaitTaskAsync.StartAsTask)과 직접 상호 작용하거나 Async.StartWithContinuations으로 자신 만의 비동기 작업을 쉽게 만들 수도 있습니다.

    당신이 MSDN documentation, 웅장한 Scott Wlaschin's site, Tomas Petricek's blog 또는 F# Wikibook 참조 할 수 비동기 워크 플로우에 대한 자세한 내용을 보려면.

  • Control.MailboxProcessor : 동시성, 즉 일반적으로 일부 정보를 공유해야하는 여러 프로세스가 동시에 실행되도록 설계되었습니다. 여러 스레드가 동시에 변수를 쓰려고 할 때 메모리 손상을 방지하는 전통적인 .NET 방법은 lock 문이었습니다. 기능적 스타일이 불변 값을 선호한다는 사실 외에도, 메모리 잠금은 적절하게 사용하기가 복잡하고 또한 고성능 페널티를 가질 수 있습니다. 그래서 이것 대신에 MailboxProcessor은 동시성에 얼랭 (Erlang)과 같은 메시지 기반 (또는 액터 기반) 접근법을 사용합니다.

    나는 MailboxProcessor 자신을 그렇게 많이 사용하지 않았지만 자세한 정보는 Scott Wlaschin's site 또는 F# Wikibook을 확인할 수 있습니다.


나는 희망이 도움이! 이 답변에서 누군가가 완전히 정확하지 않은 것을 발견하면 언제든지 편집하십시오.

건배!

+0

F # async wkf와 비슷한 기술을 사용하는 다른 언어가 있습니다 –

+0

확실하지는 않지만 많은 다른 언어를 모릅니다. 그러나 모든 현대 언어에는 매우 기본적인 수준의 비동기 처리 도구가 포함되어 있습니다. 위에서 말했듯이, Erlang은 에이전트를 가지고 있었고 EcmaScript 7은 C#에서 async/await를 통합 할 것이고 Go에는 네이티브 채널이 있습니다. Haskell의 Control.Concurrent.Async 라이브러리는 F #과 비슷한 방식으로 모나드를 사용하고 Clojure는 채널을 사용하는 core.async를 사용합니다. 대부분의 배후에있는 주된 아이디어는 변경 불가능한 데이터를 사용하면 비동기 작업에 대한 이유를 훨씬 쉽게 이해할 수 있다는 것입니다. –