gpt4 book ai didi

f# - F# 的 async 究竟是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 07:57:43 26 4
gpt4 key购买 nike

我正在努力学习 asynclet!在 F# 中工作。
我读过的所有文档似乎都令人困惑。
使用 Async.RunSynchronously 运行异步 block 有什么意义?这是异步还是同步?看起来很矛盾。

文档说 Async.StartImmediate 在当前线程中运行。如果它在同一个线程中运行,对我来说它看起来不是很异步......或者异步更像是协程而不是线程。如果是这样,他们什么时候让步?

引用 MS 文档:

The line of code that uses let! starts the computation, and then the thread is suspended until the result is available, at which point execution continues.



如果线程等待结果,我为什么要使用它?看起来像普通的旧函数调用。

Async.Parallel 做什么?它接收 Async<'T> 序列。为什么不并行执行一系列普通函数?

我想我在这里遗漏了一些非常基本的东西。我想在我理解这一点之后,所有的文档和示例都会开始有意义。

最佳答案

一些东西。

一、两者的区别

let resp = req.GetResponse()


let! resp = req.AsyncGetReponse()

是在网络请求“在海上”的可能数百毫秒(CPU 的永恒)中,前者使用一个线程(在 I/O 上阻塞),而后者使用零线程。这是异步最常见的“胜利”:您可以编写非阻塞 I/O,不会浪费任何线程等待硬盘旋转或网络请求返回。 (与大多数其他语言不同,您不会被迫进行控制反转并将事情考虑到回调中。)

二、 Async.StartImmediate将在当前线程上启动异步。一个典型的用途是使用 GUI,你有一些 GUI 应用程序想要例如更新 UI(例如,在某处说“正在加载...”),然后做一些后台工作(从磁盘加载某些内容或其他),然后在完成时返回前台 UI 线程以更新 UI(“完成!” )。 StartImmediate使异步在操作开始时更新 UI 并捕获 SynchronizationContext以便在操作结束时可以返回 GUI 以对 UI 进行最终更新。

接下来, Async.RunSynchronously很少使用(一个论点是您在任何应用程序中最多调用一次)。在极限情况下,如果您将整个程序异步编写,那么在“main”方法中,您将调用 RunSynchronously运行程序并等待结果(例如,在控制台应用程序中打印出结果)。这确实阻塞了一个线程,所以它通常只在程序异步部分的“顶部”有用,在与同步内容的边界上。 (更高级的用户可能更喜欢 StartWithContinuations - RunSynchronously 有点像从异步回到同步的“简单技巧”。)

最后, Async.Parallel进行 fork 连接并行性。您可以编写一个类似的函数,它只接受函数而不是 async s (类似于 TPL 中的内容),但 F# 中的典型优势是并行 I/O 绑定(bind)计算,这些计算已经是异步对象,因此这是最常用的签名。 (对于受 CPU 限制的并行性,您可以使用异步,但也可以使用 TPL。)

关于f# - F# 的 async 究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3539937/

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