F#数组.平行悬挂

问题描述 投票:0回答:2

过去几天我一直在努力解决 F# 中的并行和异步结构,目前不知道该往哪里走。我已经使用 F# 编程大约 4 个月了 - 当然不是专家 - 目前我有一系列在 F# (asp.net 4.5) 中实现的计算,并且在顺序执行时工作正常。我正在多核服务器上运行计算,由于有数百万个输入要执行相同的计算,我希望利用并行性来加快速度。

计算是极其数据并行的——基本上是对不同输入数据的精确计算。我尝试了多种不同的途径,但不断遇到同样的问题 - 似乎并行循环永远不会到达输入数据集的末尾。我尝试过 TPL、ConcurrentQueues、Parallel.Array.map/iter 和所有相同的结果:程序开始时很好,然后在中间的某个位置(不确定)它只是挂起并且永远不会完成。为了简单起见,我实际上从程序中删除了计算,我只是调用一个打印方法,这是代码当前所在的位置:

let runParallel = 

    let ids = query {for c in db.CustTable do select c.id} |> Seq.take(5) 

    let customerInputArray= getAllObservations ids

    Array.Parallel.iter(fun c -> testParallel c)  customerInputArray

    let key = System.Console.ReadKey()
    0

几点... 我将上面的结果限制为仅 5 个,只是为了调试。实际程序并不应用Take(5)。 testParallel 方法只是一个 printfn“测试”。

customerInputArray 是一种复杂的数据类型。它是包含记录的列表元组。所以我很确定我的问题一定在那里......但我添加了异常处理并且没有引发异常,所以不知道如何找到问题。

如有任何帮助,我们将不胜感激。预先感谢。

编辑:感谢您的建议...我认为这肯定是僵局。当我删除所有 printfn、sprintfn 和字符串连接操作时,它就完成了。 (当然,我需要那里的那些东西。)

printfn、sprintfn 和字符串操作不是线程安全的吗?

另一个编辑:迭代总是在最后一项上停止。因此,如果我的输入数组有 15 个项目,则处理会在第 14 项上停止,或者似乎永远不会到达第 15 项。然后一切都会挂起。输入数组的大小并不重要......有什么想法可能导致这个问题吗?我什至切换到 Parallel.ForEach (而不是 Array.Parallel)和相同的行为。

f# parallel-processing
2个回答
1
投票

更新情况以及我如何解决此问题。

由于我公司的防火墙政策,我无法从我的示例中上传代码,所以最终我的问题没有足够的细节。我没有提到我正在使用类型提供程序,这在这种情况下是重要的信息。但这是我想到的。

我正在使用 SQL Server 的 F# 类型提供程序,并传递其服务类型,我怀疑这些服务类型不是线程安全的。当我用普通的旧 F# 记录替换 ServiceTypes 时,代码运行良好 - 不再出现死锁,一切都完成且没有错误。


0
投票

我遇到了同样的问题,当库创建的任何线程中出现异常时,进程会挂起等待它完成几个小时,在一个线程中运行后,我发现了问题并修复了它,异常不是发生并且已修复,

© www.soinside.com 2019 - 2024. All rights reserved.