2014-12-26 6 views
0

Недавно я изучил асинхронные рабочие процессы F #, что является важной особенностью параллелизма F #. Что меня смущает, так это то, сколько подходов к написанию параллельного кода в F #? Я читал «За исключением F #» и в блоге о параллельности F #, я знаю такие вещи, как фоновые работники; IAsyncResult; Если вы программируете на локальном компьютере, в F # есть параллелизм с чередой памяти; При программировании в распределенной системе существует параллелизм передачи сообщений. Но я действительно не уверен, что такое отношения между этими методами и как их классифицировать. Я понимаю, что «большой» вопрос не может быть ответом с одним или двумя предложениями, поэтому я определенно буду признателен, если кто-нибудь может дать мне конкретный ответ или порекомендовать мне некоторые полезные ссылки.Какова связь между различными подходами F # concurrency

ответ

0

Я также довольно новыми для F #, так что я надеюсь, что больше ответы приходят в дополнение к этому один :)

Первое, что вам нужно различать между .NET классов (которые могут быть использованы с любой .NET language) и F # уникальные способы для работы с асинхронными операциями. В первом случае, как вы говорите, и среди других, у вас есть:

  • System.ComponentModel.BackgroundWorker: Это использовалось в основном в первых версиях .NET с помощью Windows Forms и не рекомендуется больше.

  • System.IAsyncResult: Это также старый интерфейс .NET, реализованный несколькими классами (также Task), но я обычно не использую его напрямую.

  • Windows.Foundation.IAsyncOperation: Еще один интерфейс, но используется только в приложениях Windows Store. В большинстве случаев вы переводите его непосредственно в Task, поэтому вам не нужно слишком беспокоиться об этом.

  • System.Threading.Tasks.Task: Это рекомендуемый способ теперь обрабатывать .NET асинхронную и параллельную (с параллельной библиотекой задач) операции. Это скрытая сила ключевых слов C# async/await, которые являются просто синтаксическим сахаром, чтобы передать продолжение в Tasks.


Так что теперь с F # уникальными способами: Асинхронные Workflows и MailboxProcessor. Можно грубо сказать, что первое соответствует параллелизму, а последнее касается параллелизма.

  • Asynchronous Workflows: Это просто выражение вычисления (ака монада), который случается иметь дело с асинхронности: операции, которые выполняются в фоновом режиме, чтобы предотвратить блокирование потока пользовательского интерфейса или параллельных операций, чтобы получить максимальную производительность в многоядерных системы.

    Это более или менее эквивалентно C# асинхронная/Await но мы F # фанаты любят думать, что это более элегантное решение, поскольку он использует более общий и гибкий механизм (вычисления выражения), которые могут быть адаптированы, например, asynchronous sequences, events или даже Javascript callbacks. Он также имеет другие преимущества, как объясняет Томас Петричек here.

    Внутри асинхронного рабочего процесса большую часть времени вы будете использовать методы в Control.Async или расширения для классов .NET (например, WebRequest.AsyncGetResponse) из основной библиотеки F #.При необходимости вы также можете напрямую взаимодействовать с .NET Tasks (Async.AwaitTask и Async.StartAsTask) или даже легко создавать свои собственные асинхронные операции с помощью Async.StartWithContinuations.

    Чтобы узнать больше о асинхронных рабочих процессах вы можете обратиться к MSDN documentation, великолепный Scott Wlaschin's site, Tomas Petricek's blog или F# Wikibook.

  • Control.MailboxProcessor: Предназначен для борьбы с параллелизмом, то есть с несколькими процессами, выполняющимися одновременно, что обычно необходимо обмениваться некоторой информацией. Традиционный способ .NET предотвращать повреждение памяти, когда несколько потоков пытаются написать переменную одновременно, было оператором блокировки. Помимо того факта, что функциональный стиль предпочитает использовать неизменяемые значения, блокировки памяти сложны в правильном использовании и могут также иметь высокую производительность. Таким образом, вместо этого MailboxProcessor использует подход, основанный на Эрланге (основанный на акциях) или параллельный подход к параллелизму.

    Я сам не использовал MailboxProcessor, но для получения дополнительной информации вы можете проверить Scott Wlaschin's site или F# Wikibook.


Я надеюсь, что это помогает! Если кто-то видит что-то не совсем корректное в этом ответе, не стесняйтесь его редактировать.

Cheers!

+0

Есть ли другие языки, которые используют похожие методы, такие как F # async wkf –

+0

Я не знаю многих других языков, поэтому я не уверен, но, очевидно, все современные языки включают в себя инструменты для работы с асинхронностью на самом базовом уровне. Как было сказано выше, у Erlang были агенты, EcmaScript 7, скорее всего, включит async/wait из C#, а Go имеет собственные каналы. Библиотека Control.Concurrent.Async в Haskell использует монады аналогично F #, а у Clojure есть core.async, который использует каналы. Основная идея большинства из них заключается в том, что использование неизменных данных облегчает рассуждение об асинхронных операциях. –

Смежные вопросы