gpt4 book ai didi

asynchronous - 有没有办法让F#中的异步工作流自动流水线?

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

(请注意,我在谈论流水线,就像在并行运行独立进程中一样;与|>运算符无关)。

所以如果我有两个功能

let incr x = 
Thread.Sleep 1000
x + 1

let product x y =
Thread.Sleep 1000
x * y

是否有一种简单的方法来编写类似(pseudocode)的工作流程
let productOfIncrements x y = 
async {
let! x1 = incr x
let! y1 = incr y
let! result = product x1 y1
return result
}

是通过管道传输前两个独立的操作并因此在两秒钟内执行,还是异步工作流解决此问题的方法错误?如果有解决该问题的好方法,是否有直接方法将这种方法扩展为可以在N + 1秒而不是2N的时间内进行递归阶乘计算?

最佳答案

最简单的选择是使用Async.StartChild。此主对象在后台(在线程池中)启动异步操作,并返回可用于等待操作完成的“ token ”。这不会阻塞工作流程,因此您可以继续运行其他操作:

let productOfIncrements x y = 
async {
// Start the 'incr x' operation in background
let! x1Op = async {return incr x} |> Async.StartChild
// Continue doing other work
// (synchronously since it takes the same time as the above.)
let y1 = incr y
// Now wait for the result of 'incr x' (if it is still running)
let! x1 = x1Op
// return the product (just call the function synchronously)
return product x1 y1
}

如果两个操作返回相同的类型,则还可以使用 Async.Parallel,它构成了多个要并行运行的操作。

如果您使用的是纯粹受CPU限制的计算,并且需要创建大量计算,那么您也可以直接使用.NET Tasks(例如,参见 this article)。任务效率更高,但使用起来却不那么优雅(并且不很好地支持异步等待)。

附带说明一下,管道一词通常用于(至少在F#或.NET世界中)用于更复杂的事情-例如,假设您有一系列相互依赖的步骤。处理多个输入时,您可以并行运行这些步骤(并且仍然会限制总并行运算)。也可以使用F#异步工作流完成此操作-请参见 for example this article。还有一个实现该概念的 framework named pipelets

关于asynchronous - 有没有办法让F#中的异步工作流自动流水线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6899505/

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