You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Async.Parallel的此用法始终无法完成?

问题分析:Async.Parallel导致程序挂起而非崩溃的原因

先看你提供的代码:

open System

async {
    printfn "a"

    do!
        Async.Parallel [|
            Async.FromContinuations ignore // Sleep forever
            async { return raise (Exception("Kaboom")) }
        |]
        |> Async.Ignore<unit array>

    printfn "b"
}
|> Async.RunSynchronously

程序仅输出a后挂起,printfn "b"永远不执行,也没有异常抛出,核心原因在于Async.Parallel的行为逻辑和你创建的第一个任务的特性:

  • Async.Parallel的执行规则:它会并行启动所有子任务,只有当所有任务都完成(成功或被取消)时,才会推进后续逻辑。如果某一个任务抛出异常,它会尝试取消其余未完成的子任务,随后传播异常。但这个逻辑的前提是,其余任务能够响应取消请求。

  • 无法响应取消的子任务:你代码里的Async.FromContinuations ignore是通过底层API创建的任务,它直接忽略了所有延续函数——包括用于处理取消的回调。这意味着当Async.Parallel尝试取消它时,没有任何逻辑会被触发,这个任务会永远处于挂起状态,既不会完成,也不会处理取消信号。

  • 最终导致挂起:第二个任务抛出异常后,Async.Parallel会触发对第一个任务的取消操作,但因为第一个任务无法被取消,Async.Parallel会一直等待它结束。这就导致整个异步工作流卡在do!步骤,既无法继续执行printfn "b",也不会抛出异常(因为它还在等待未完成的任务)。

如果想让异常正常传播,需要确保所有并行任务都能响应取消。比如把第一个任务改成Async.Sleep -1(虽然也是无限等待,但它内置了取消响应逻辑),此时当第二个任务抛出异常,Async.Parallel会成功取消第一个任务,随后传播异常,程序会直接崩溃而非挂起。

内容的提问来源于stack exchange,提问作者sdgfsdh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:37:35