为什么不应该使用 F# 异步工作流程来实现并行性?

2024-01-28

我最近一直在学习 F#,对其轻松利用数据并行性特别感兴趣。这data |> Array.map |> Async.Parallel |> Async.RunSynchronously习语似乎很容易理解、易于使用并从中获得真正的价值。

那么为什么会这样呢async真的不是为了这个吗?唐纳德·赛姆本人 http://blogs.msdn.com/b/dsyme/archive/2007/10/11/introducing-f-asynchronous-workflows.aspx说 PLINQ 和 Futures 可能是更好的选择。我在这里读到的其他答案也同意这一点,并推荐 TPL。 (PLINQ 看起来与上面的内置函数没有太大区别,只要您使用 F# Powerpack 来获取PSeq功能。)

F# 和函数式语言对此非常有意义,并且一些应用程序 http://www.langnetsymposium.com/2009/talks/21-AmanderLauter-FSharpConcurrency.html取得了巨大的成功async并行性。

So why 不应该 I use async执行并行数据处理?写并行我会失去什么async代码而不是使用 PLINQ 或 TPL?


那么为什么我不应该使用 async 来执行并行数据处理呢?

如果你有一小部分完全独立的非async任务和大量核心,那么使用异步来实现并行性没有任何问题。但是,如果您的任务以任何方式相互依赖,或者您的任务多于核心,或者您推动使用async深入代码,那么您将失去很多性能,并且可以通过选择更合适的并行编程基础来做得更好。

请注意,您的示例可以使用 F# 中的 TPL 编写得更加优雅:

Array.Parallel.map f xs

通过编写并行异步代码而不是使用 PLINQ 或 TPL,我会失去什么?

您失去了编写缓存无关代码的能力,因此,将遭受大量缓存未命中,因此,所有内核都会停止等待共享内存,这意味着多核上的可扩展性很差。

TPL 的构建理念是,子任务很有可能在与其父任务相同的核心上执行,因此,将受益于重用相同的数据,因为这些数据在本地 CPU 缓存中会很热。异步则没有这样的保证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不应该使用 F# 异步工作流程来实现并行性? 的相关文章

  • F# nameof 运算符不是一等函数

    我正在使用 F 4 7
  • 如何在 Emgu CV 项目中利用 OpenCL

    我是使用 Emgu CV 的新手 并开始创建小型示例项目 例如面部检测 眼睛检测等 如果我可以利用 OpenCL 来加速使用 GPU 的过程 那就太好了 否则 当我降低scaleFactor时 它会导致大量的CPU利用率 我怎样才能做到这一
  • Android:等待 firebase valueEventListener

    我正在尝试使用信号量来等待我的 firebase valueEventListener 我有一个用户信息活动 其中包含用户必须填写的 6 个不同字段 当用户保存他 她的信息时 我想进行 全有或全无 类型的检查 某些用户信息不能重复 例如用户
  • 如何使用Task.WhenAny并实现重试

    我有一个创建多个基于 I O 的任务的解决方案 我正在使用Task WhenAny 来管理这些任务 但通常许多任务会由于网络问题或请求限制等原因而失败 我似乎找不到一个解决方案 使我能够在使用时成功重试失败的任务Task WhenAny 方
  • 如何延迟 AngularJS 应用程序初始化?

    我有一些数据正在后台异步处理 并且希望延迟整个 AngularJS 应用程序的初始化 直到完成 BackgroundData initialized 是一个 Q 承诺 所以像这样 BackgroundData initialized the
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 满足条件时终止所有进程

    我正在使用星图来运行测试功能 当进程首次找到排列 5 2 4 3 1 时 终止所有进程的最佳 最安全方法是什么 import multiprocessing as mp import time def testing lts code st
  • Ruby 中的任务/未来

    代表潜在延迟的异步计算并且可以订阅其完成的模式的惯用 Ruby 模拟是什么 即类似于 NET 的东西System Threading Task 或Python 3 xconcurrent futures future 请注意 这并不一定意味
  • 如何在 Android 应用程序中使用多个 Graph API 获取 Facebook Notes 项目的评论?

    我想使用 Graph API 显示 Facebook 页面的注释项目以及这些评论和点赞 为此 我使用 Facebook SDK 中的 asyncFacebookRunner 步骤是这样的 调用 asyncFacebookRunner req
  • 是否可以在 OpenCL 中并行运行求和计算?

    我是 OpenCL 的新手 不过 我了解 C C 基础知识和 OOP 我的问题如下 是否可以以某种方式并行运行求和计算任务 理论上可能吗 下面我将描述我尝试做的事情 任务例如是 double values new double 1000 l
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 异步多播委托

    我最近在一个广泛使用事件的项目上做了一些工作 我需要做的事情之一是在多播委托上异步调用多个事件处理程序 我认为诀窍是对 GetInvocableList 中的每个项目调用 BeginInvoke 但似乎那里不存在 BeginInvoke 有
  • 有没有办法伪造同步 XHR 请求?

    我正在使用 Emscripten 系统将一堆 C 代码移植到 Javascript C 代码有很多调用fopen这是一个同步 IO 调用 在 Emscripten 中 我们使用对本地资源的 XHR 请求来模拟这一点however 在 Fir
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 使用 MPI 的 Allreduce 对 Python 对象求和

    我正在使用使用 Python 中的字典和计数器构建的稀疏张量数组操作 我想让并行使用这个数组操作成为可能 最重要的是 我最终在每个节点上都有计数器 我想使用 MPI Allreduce 或另一个不错的解决方案 将其添加在一起 例如 使用计数
  • 调用异步方法时什么情况下使用.Wait()

    我有以下内容async我的 asp net mvc 5 Web 应用程序中长时间运行的方法 public async Task
  • 任务并行库周围是否有一个接口包装器,以便我可以将其交换用于单元测试?

    I asked 这个问题 https stackoverflow com questions 3362734 unit testing concurrent software what do you do不久以前 我现在知道这是一个坏主意
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和

随机推荐

  • Django 多态模型在 1.7 上进行迁移时出现问题

    我在我的模型中使用 Django 1 7 和 django polymorphic class ReferenceItem PolymorphicModel created at models DateTimeField date crea
  • MVP - Presenter 和服务层 - 在哪里声明服务层

    我正在通读为企业构建 Microsoft Net 解决方案我试图弄清楚有关演示者和服务层的一些事情 首先 我的 Presenter 需要调用驻留在服务层中的方法 例如initialize save 等 但是我在哪里放置对服务层的引用呢 它应
  • 如何使用 lambda 函数在列表/数组中查找具有匹配字母的字符串?

    我正在使用 lambda 函数 python 3 6 和 Mongodb atlas 在 mongodb 中 我有一个像这样的集合 集合名称配置文件 下面作为集合结构 id ObjectId 5db234df92b0ce00016932f3
  • [UITableView indexPathsForVisibleRows] 可能存在错误?

    我一直在我的代码中尝试这个 但它不起作用 NSArray paths aUITableView indexPathsForVisibleRows 返回一个空的 NSArray 但如果我在前一行中这样做 它就可以正常工作 这是一个框架错误吗
  • 字段成员与方法变量?

    最近我一直在思考类字段成员和方法变量之间的性能差异 我的确切意思是在下面的例子中 假设我们有一个DataContext对象为Linq2SQL class DataLayer ProductDataContext context new Pr
  • 时间:2019-01-17 标签:c#gridviewrowclick

    当我单击 GridView 中的一行时 我想使用从数据库获取的 ID 转到其他页面 在我的 RowCreated 事件中 我有以下行 e Row Attributes Add onClick ClientScript GetPostBack
  • 通过gradle构建项目时JVM空间耗尽

    通过gradle构建项目时收到错误消息 由于 JVM Tenured 空间已耗尽 守护进程即将到期 这意味着 JVM 没有足够的内存来编译 Java 文件 可以采取几个步骤 Run gradlew clean 这将删除所有内容 包括以前版本
  • 关于将 getchar() 返回值存储在 char 变量中

    I know以下代码已损坏 getchar 返回一个int not a char include
  • VBA XML 解析 - 循环子节点

    这是我第一次尝试使用 VBA 解析 XML 文件 因此我可能会遗漏一些显而易见的内容 我已经可以打印这个
  • 如何调试使用 rebar3 时运行的 Eunit 测试套件?

    我创建了一个release带有 rebar3 beta 4 的应用程序 添加了一些 eunit 测试并编写了一些代码 现在我必须调试一个测试用例 看看我必须添加什么才能使实现正常工作 我找到了一些关于使用的文章dbg从 Erlang 控制台
  • @property 和 @synthesize

    我对 Objective C 很陌生 两天了 当读到关于 synthesize 好像和我的理解有重叠 property 我以为我理解了 所以 一些细节需要在我的脑海中解决 这让我烦恼 如果我对差异的理解有误 请纠正我 property an
  • C# + 运算符调用 string.concat 函数? [复制]

    这个问题在这里已经有答案了 可能的重复 C 是否优化字符串文字的串联 https stackoverflow com questions 288794 does c sharp optimize the concatenation of s
  • AngularJS 中文本框更改时延迟调用函数

    似乎无法通过谷歌搜索如何完成此操作的示例 我已经成功创建了一个文本框 每次更改时都会调用一个函数 我想做的只是当用户停止输入 x 毫秒时才调用该函数 我知道如何使用 keyup 事件在 JQuery 中执行此操作 并且可能可以使其以这种方式
  • 使用 VSCode 创建并运行 Dart 控制台应用程序?

    我可以使用 VSCode 创建 Flutter 新应用程序 现在我想学习Dart编程语言 如何使用 VS Code 创建并运行 Dart 控制台应用程序 有一种简单的方法可以创建和运行 Dart 控制台应用程序 打开 VSCode 在 Ma
  • 将 Pandas DataFrame 写入换行符分隔的 JSON

    我首先通过 pandas read csv 函数将 CSV 读入 Pandas 数据帧 现在数据位于实际的数据框中 我尝试编写如下内容 for row in df iterrows row 1 to json path to file 这是
  • 在 MATLAB 中添加包围向量中 1 的其他值的附加值

    给定 MATLAB 中的零和一向量 其中零代表时间事件 我想在现有向量之前和之后添加额外的向量 以捕获额外的变化 Example 我想转 0 0 1 0 0 into 0 1 1 1 0 where 1 是新添加的 假设A为输入列向量 Fi
  • 根据位置重新排序行 SQL Server

    我在 SO 上看到了很多关于这个问题的问题 但没有一个与我的场景相关 除了基本的 CRUD 操作之外 我还算不上一个 SQL 专家 因此我对此很坚持 我有一张桌子 myTable rID newsID OrderPosition where
  • 在 Spark 中保存有序数据帧

    我正在尝试将有序数据帧保存到 HDFS 中 我的代码如下所示 dataFrame orderBy index write mode SaveMode Overwrite parquet getPath 我在两个不同的集群上运行相同的代码 一
  • 如何在 PHPUnit 测试中显示底层测试方法?

    我有测试套件 里面有很多测试 这是一个中等大小的 ok 4 CommodityBasketTest testStartsOutEmpty ok 5 CommodityBasketTest testCanAddACommodity ok 6
  • 为什么不应该使用 F# 异步工作流程来实现并行性?

    我最近一直在学习 F 对其轻松利用数据并行性特别感兴趣 这data gt Array map gt Async Parallel gt Async RunSynchronously习语似乎很容易理解 易于使用并从中获得真正的价值 那么为什么