gpt4 book ai didi

f# - 了解 F# 异步编程

转载 作者:行者123 更新时间:2023-12-03 11:37:28 24 4
gpt4 key购买 nike

我有点了解 F# 中异步编程的语法。例如。

let downloadUrl(url:string) = async { 
let req = HttpWebRequest.Create(url)
// Run operation asynchronously
let! resp = req.AsyncGetResponse()
let stream = resp.GetResponseStream()
// Dispose 'StreamReader' when completed
use reader = new StreamReader(stream)
// Run asynchronously and then return the result
return! reader.AsyncReadToEnd() }

在 F# 专家书籍(和许多其他来源)中,他们说像

let! var = expr simply means "perform the asynchronous operation expr and bind the result to var when the operation completes. Then continue by executing the rest of the computation body"



我也知道执行异步操作时会创建一个新线程。我最初的理解是异步操作后有两个并行线程,一个做I/O,一个同时继续执行异步主体。

但在这个例子中,我很困惑
  let! resp = req.AsyncGetResponse()
let stream = resp.GetResponseStream()

如果 resp 会发生什么?尚未开始,异步主体中的线程想要 GetResponseStream ?这是一个可能的错误吗?

所以也许我最初的理解是错误的。 F#专家书中引用的句子实际上是“创建一个新线程,将当前线程挂起,当新线程完成时,唤醒主体线程并继续”,但在这种情况下我看不到我们可以保存随时。

在原来的理解中,有几个 是节省时间的。独立 在一个异步 block 中进行 IO 操作,以便它们可以同时完成而无需相互干预。但是在这里,如果我没有得到响应,我就无法创建流;只有我有流,我可以开始阅读流。时间去哪儿了?

最佳答案

这个例子中的“异步”不是关于并发或节省时间,而是关于提供一个没有阻塞(阅读:浪费)线程的良好编程模型。

如果使用其他编程语言,通常您有两种选择:

您可以 block ,通常通过调用同步方法。缺点是线程在等待磁盘或网络 I/O 或您拥有的东西时被消耗并且没有做任何有用的工作。优点是代码简单(普通代码)。

您可以使用回调 在操作完成时异步调用并获取通知。优点是您不会阻塞线程(这些线程可以返回到例如 ThreadPool 并且在操作完成时将使用新的 ThreadPool 线程来回调您)。缺点是一个简单的代码块被分成一堆回调方法或 lambda,并且在回调之间维护状态/控制流/异常处理很快就会变得非常复杂。

所以你在岩石和坚硬的地方之间;你要么放弃简单的编程模型,要么浪费线程。

F# 模型两全其美;你不会阻塞线程,但你保持简单的编程模型。像 let! 这样的结构使您能够在异步 block 的中间“线程跳跃”,所以在代码中

Blah1()
let! x = AsyncOp()
Blah2()
Blah1可以在 ThreadPool 线程 #13 上运行,但随后 AsyncOp 会将该线程释放回 ThreadPool。稍后,当 AsyncOp 完成时,其余代码将在绑定(bind) x 的可用线程(例如,ThreadPool 线程#20)上重新启动。到结果,然后运行 ​​ Blah2 .在琐碎的客户端应用程序中,这并不重要(除非确保您不会阻塞 UI 线程),但在执行 I/O 的服务器应用程序中(线程通常是宝贵的资源 - 线程很昂贵,您不能浪费它们阻塞)非阻塞 I/O 通常是使应用程序扩展的唯一方法。 F# 使您能够编写非阻塞 I/O,而不会使程序退化为大量意大利面条式代码回调。

也可以看看

Best practices to parallelize using async workflow

How to do chained callbacks in F#?

http://cs.hubfs.net/forums/thread/8262.aspx

关于f# - 了解 F# 异步编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2444676/

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