gpt4 book ai didi

asynchronous - 为什么嵌套异步计算?

转载 作者:行者123 更新时间:2023-12-04 08:01:38 26 4
gpt4 key购买 nike

考虑以下两种构建 Async 的方式计算 1 + 2 的计算:

let c1 =
async {
let a = 1
let b = 2
return a + b }

let c2 =
async {
let a = 1
let! b = async { return 2 }
return a + b }
它们之间的实际区别是什么?在我看来,他们做同样的事情。例如,为什么您需要使用 let! result = streamReader.ReadToEndAsync ()而不是 let result = streamReader.ReadToEnd () ?计算运行时两行不是都“阻塞”了吗?

最佳答案

你的愚蠢例子 let! b = async { return 2 }确实没有带来任何新东西。确实完全等同于let b = 2 .
然而,这是一个不同的故事,ReadToEnd对比 ReadToEndAsync .虽然它们都可以被描述为“阻塞”,但它们的阻塞方式却截然不同。ReadToEnd是同步的。当它在一个线程上被调用时,该线程停止并等待它完成。线程被阻塞。它什么都不做,但也不能用于执行任何其他操作。ReadToEndAsync用途 asynchronous I/O (在 Windows 上也称为“overlapped I/O”)。这基本上意味着线程在此时停止并调用操作系统,说“嘿,请为我阅读这个文件并在你完成后唤醒我”。它在较低级别实现的方式因操作系统而异,但通常您会在调用完成时获得某种回调。
这在高可用性高并发系统中很重要,例如 HTTP 服务器。但是,如果您只是在人工监督下在计算机上本地运行脚本,那么只需使用更方便的方法即可。
有趣的是,同步版本ReadToEnd实际上在幕后也使用异步 I/O,它只是包装在同步阻塞包装器中,以便在简单情况下更方便使用。

关于asynchronous - 为什么嵌套异步计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66438571/

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