代码之家  ›  专栏  ›  技术社区  ›  Roger Johansson

让我来!按顺序执行?

  •  2
  • Roger Johansson  · 技术社区  · 14 年前

    我的印象是让!在f中,他足够聪明,可以并行地执行一系列的赋值。

        let sleep sec =
            async
                {
                    System.Threading.Thread.Sleep(sec * 1000)
                    return sec
                }
    
        let bar = async 
                    {
                        let! a = sleep 1
                        let! b = sleep 3
                        let! c = sleep 3
                        return a+b+c
                    }
    
        let foo = Async.RunSynchronously(bar)
        printfn "%d" foo
    

    是这样吗?

    如果我想并行执行a,b,c,我应该用异步并行... |&燃气轮机;异步运行... 然后呢?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Tomas Petricek    14 年前

    正如Richard指出的,异步工作流仍然是完全顺序的。我不认为任何试图进行全自动并行化的项目都是完全成功的,因为这样做太困难了。

    但是,异步工作流仍然使并行化更容易。关键的是,它们可以在不阻塞线程的情况下进行等待(这对于可伸缩性至关重要),而且它们还支持自动取消和简单的异常处理,使您的生活更轻松。有各种模式允许您在异步工作流中并行化代码。

    • 基于任务的 您可以在后台启动三个任务,然后等待所有任务完成(这可能是您所期望的,下面是如何显式编写):

      let bar = async  { 
        let! atask = sleep 1 |> Async.StartChild
        let! btask = sleep 3 |> Async.StartChild
        let! ctask = sleep 3 |> Async.StartChild
        let! a = atask
        let! b = btask
        let! c = ctask
        return a + b + c } 
      
    • 数据并行 -如果有多个相同类型的工作流,则可以使用创建并行运行所有工作流的工作流 Async.Parallel . 当你使用 let!

      let bar = async  { 
        let! all = Async.Parallel [ sleep 1; sleep 3; sleep 3 ]
        return all.[0] + all.[1] + all.[2] } 
      

    唐·赛姆有篇文章讨论 various patterns 基于异步工作流,您可以在 financial dashboard sample

        2
  •  2
  •   Richard    14 年前

    let! ,在 async 块(或者更准确地说是“计算表达式”)执行表达式 但是块作为一个整体仍然是线性执行的。这就是 异步

    (其他类型的计算表达式为 , yield! 等)

    表达式单独执行。

    我在印象中

    推荐文章