F#阵列。平行悬挂

F#阵列。平行悬挂,f#,parallel-processing,F#,Parallel Processing,在过去的几天里,我一直在为F#中的并行和异步构造而苦苦挣扎,现在还不知道该怎么办。我已经用F#编程了大约4个月——当然不是专家——目前我有一系列的计算在F#(asp.net 4.5)中实现,并且在按顺序执行时工作正常。我在一个多核服务器上运行计算,由于有数百万个输入要执行相同的计算,我希望利用并行性来加快计算速度 计算是非常并行的数据-基本上是对不同输入数据的精确计算。我已经尝试了许多不同的途径,并且不断遇到相同的问题——似乎并行循环永远不会到达输入数据集的末尾。我已经尝试过TPL、并发队列、并

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

计算是非常并行的数据-基本上是对不同输入数据的精确计算。我已经尝试了许多不同的途径,并且不断遇到相同的问题——似乎并行循环永远不会到达输入数据集的末尾。我已经尝试过TPL、并发队列、并行.ARAY.MAP/ITER和所有相同的结果:程序启动得很好,然后中间的某个地方(不确定的)只会挂起,而且永远不会完成。为了简单起见,我实际上从程序中删除了计算,我只是调用了一个print方法,下面是代码当前的位置:

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和stringconcat操作时,它就完成了。(当然,我需要这些东西。)

printfn、sprintfn和string操作不是线程安全的吗


另一个编辑:迭代总是在最后一个项目上停止。因此,如果我的输入数组有15个项目,则处理在项目14上停止,或者似乎永远不会到达项目15。然后一切都挂了。输入数组的大小无关紧要。你知道是什么原因造成的吗?我甚至切换到Parallel.ForEach(而不是Array.Parallel)和相同的行为

最新情况以及我如何解决这个问题

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


我正在使用SQL Server的F#type提供程序,并在传递其服务类型,我怀疑这些服务类型不是线程安全的。当我用普通的旧F#记录替换ServiceTypes时,代码运行得很好——不再出现死锁,所有的事情都顺利完成

最新情况以及我如何解决这个问题

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


我正在使用SQL Server的F#type提供程序,并在传递其服务类型,我怀疑这些服务类型不是线程安全的。当我用普通的旧F#记录替换ServiceTypes时,代码运行得很好——不再出现死锁,所有的事情都顺利完成

您是否尝试过暂停执行以查看哪些操作需要花费大量时间?另外,尝试用简单的数据类型替换复杂的数据类型,如
让ids=[1;2;3;4;5]
请调试您的程序,使用调试器或至少在代码周围添加printf来查看挂起的位置。是否存在死锁的可能性?请参阅上面的编辑。我认为我传递给TextWriter的字符串是以非线程安全的方式构造的…我使用sprintf,甚至尝试了“+”操作。我想说,
printfn
绝对不是线程安全的-您无法在
%A或%O
中防止任意代码。您是否尝试过暂停执行以查看哪些代码花费了大量时间?另外,尝试用简单的数据类型替换复杂的数据类型,如
让ids=[1;2;3;4;5]
请调试您的程序,使用调试器或至少在代码周围添加printf来查看挂起的位置。是否存在死锁的可能性?请参阅上面的编辑。我认为我传递给TextWriter的字符串是以非线程安全的方式构造的…我使用sprintf,甚至尝试了“+”操作。我想说,
printfn
绝对不是线程安全的-您无法在
%A或%O
中防止任意代码。