![]() |
1
23
如果使用其他编程语言,通常有两种选择: 块 ,通常通过调用同步方法。缺点是线程在等待磁盘或网络I/O或您所拥有的东西时被消耗,并且没有做任何有用的工作。优点是代码简单(普通代码)。 你可以用 回调 异步调用并在操作完成时获取通知。优点是不阻塞线程(这些线程可以返回到线程池,当操作完成时将使用一个新的线程池线程来回叫您)。缺点是一个简单的代码块被划分成一堆回调方法或lambda,在回调中维护状态/控制流/异常处理很快变得非常复杂。
F#模型提供了两个世界中最好的;您不阻塞线程,但是您保持了简单的编程模型。构造像
另请参见 Best practices to parallelize using async workflow |
![]() |
2
9
我认为最重要的是要了解
异步工作流
是的,他们是
相继的
与用F#(或C#)编写的普通代码的顺序相同。你有一些
异步工作流
是的,他们是
. 这意味着您可以在某些应用程序中执行操作
对于并行或并发编程,使用F#异步工作流的方法也有很多种,但是这些方法只是对F#工作流或构建在其上的库的更复杂的使用—它们利用了前面描述的非阻塞行为。
|
![]() |
3
3
这并不是“获得的时间”的问题,异步编程不会使数据到达更快。相反,它是关于简化并发的心智模型。 例如,在C#中,如果要执行异步操作,就需要开始处理回调,并将本地状态传递给这些回调,以此类推。对于一个简单的操作,比如 专家F# 对于两个异步操作,您将看到三个看似独立的方法(启动器和两个回调)。这掩盖了工作流的顺序性、概念上的线性性质:do请求、读取流、打印结果。 相比之下,F#async工作流代码使程序的顺序非常清晰。只需看一段代码,就可以准确地判断出以什么顺序发生的事情。你不需要追踪回叫。 也就是说,如果有几个独立的异步操作正在进行,F#确实有一些机制可以帮助节省时间。例如,您可以同时启动多个异步工作流,它们将并行运行。但是在一个异步工作流实例中,它主要是关于简单性、安全性和可理解性的:让您可以像推理C#风格的同步语句序列一样轻松地推理异步语句序列。 |
![]() |
4
2
这是个好问题。需要注意的是,在一个
|
![]() |
Jess The Witch · GCP云功能中处理延迟任务的模式 5 月前 |
![]() |
Plup · 连接失败时,PyMongo异步客户端未引发异常 6 月前 |
![]() |
user1233894 · 尝试从全局函数传递值 6 月前 |
![]() |
Fabiano Taioli · 管理单线程Rust中的阻塞函数 10 月前 |
![]() |
river7816 · 为什么spdlog不在async函数中打印 11 月前 |