gpt4 book ai didi

f# - 任务并行库与异步工作流

转载 作者:行者123 更新时间:2023-12-03 10:15:38 28 4
gpt4 key购买 nike

我有一些用 c# 编写的东西,可以执行并发代码,大量使用任务并行库(任务和 future 延续链)。

我现在将其移植到 F# 并试图找出使用 F# 异步工作流与 TPL 中的构造的优缺点。我倾向于 TPL,但我认为这两种方式都可以完成。

有没有人有关于在 F# 中编写并发程序的技巧和智慧来分享?

最佳答案

名称几乎总结了差异:异步 编程与 平行编程。但在 F# 中,您可以混合搭配。

F# 异步工作流

当您希望异步执行代码时,F# 异步工作流会很有帮助,即启动任务而不是等待最终结果。最常见的用法是 IO 操作。让您的线程在空闲循环中等待您的硬盘完成写入会浪费资源。

如果您异步开始写操作,您可以挂起线程并稍后通过硬件中断唤醒它。

任务并行库

.NET 4.0 中的任务并行库抽象了任务的概念——例如解码 MP3,或从数据库中读取一些结果。在这些情况下,您实际上想要计算的结果,并且在稍后的某个时间点等待操作的结果。 (通过访问 .Result 属性。)

您可以轻松地混合和匹配这些概念。例如在 TPL 任务对象中执行所有 IO 操作。对于程序员来说,您已经抽象了“处理”额外线程的需要,但在幕后您正在浪费资源。

同样,您可以创建一系列 F# 异步工作流并并行运行它们 (Async.Parallel),但随后您需要等待最终结果 (Async.RunSynchronously)。这使您无需显式启动所有任务,但实际上您只是在并行执行计算。

根据我的经验,我发现 TPL 更有用,因为通常我想并行执行 N 个操作。但是,F# 异步工作流非常适合在“幕后”发生某些事情时,例如响应式(Reactive)代理或邮箱类型的事情。 (您向某物发送一条消息,它会对其进行处理并将其发回。)

希望有帮助。

关于f# - 任务并行库与异步工作流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1871168/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com