Недавно я изучил асинхронные рабочие процессы F #, что является важной особенностью параллелизма F #. Что меня смущает, так это то, сколько подходов к написанию параллельного кода в F #? Я читал «За исключением F #» и в блоге о параллельности F #, я знаю такие вещи, как фоновые работники; IAsyncResult; Если вы программируете на локальном компьютере, в F # есть параллелизм с чередой памяти; При программировании в распределенной системе существует параллелизм передачи сообщений. Но я действительно не уверен, что такое отношения между этими методами и как их классифицировать. Я понимаю, что «большой» вопрос не может быть ответом с одним или двумя предложениями, поэтому я определенно буду признателен, если кто-нибудь может дать мне конкретный ответ или порекомендовать мне некоторые полезные ссылки.Какова связь между различными подходами F # concurrency
ответ
Я также довольно новыми для 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!
- 1. Какова связь между различными версиями протокола WebSocket?
- 2. Путаница между подходами ООП между различными разработчиками
- 3. Связь между различными формами
- 4. связь между различными приложениями
- 5. Связь между различными браузерами
- 6. Какова связь между методами расширения C# и оператором переадресации F #?
- 7. связь между двумя различными контроллерами
- 8. RMI Связь между различными JVM
- 9. Какова наилучшая связь между потоками?
- 10. Разница между подходами Service.create
- 11. Анализ производительности функциональности с различными подходами Linux
- 12. Какова связь между C и Windows API?
- 13. Как управляется связь между различными Namenodes?
- 14. сделать связь между различными физическими базами данных
- 15. FIFO Связь между двумя различными процессами C++
- 16. reactJs: Связь между двумя различными компонентами
- 17. Связь между различными окнами в одном домене
- 18. Связь между различными ViewControllers в Cocoa
- 19. стека ZigBee - связь между различными слоями
- 20. Связь между двумя различными версиями python
- 21. Какова связь между View Space & NDC?
- 22. Какова связь между ARM и Android?
- 23. Какова связь между «кучей» и «кучей»?
- 24. Какова связь между страницами.IsValid и args.IsValid
- 25. Какова связь между UIPageViewController и UIPageControl?
- 26. Какова связь между .ycm_extra_conf.py и Exuberant Ctags
- 27. Какова связь между деревьями деривации и деривации?
- 28. Какова связь между WinAPI и .NET?
- 29. Какова связь между потоками TYPO3 и TYPO3?
- 30. какова связь между CVBuffer и CVImageBuffer
Есть ли другие языки, которые используют похожие методы, такие как F # async wkf –
Я не знаю многих других языков, поэтому я не уверен, но, очевидно, все современные языки включают в себя инструменты для работы с асинхронностью на самом базовом уровне. Как было сказано выше, у Erlang были агенты, EcmaScript 7, скорее всего, включит async/wait из C#, а Go имеет собственные каналы. Библиотека Control.Concurrent.Async в Haskell использует монады аналогично F #, а у Clojure есть core.async, который использует каналы. Основная идея большинства из них заключается в том, что использование неизменных данных облегчает рассуждение об асинхронных операциях. –