ここ数日間、F# の並列および非同期構造に苦労しており、現時点でどこに行けばよいかわかりません。私は約 4 か月間 F# を使用してプログラミングしてきました (確かに専門家ではありません)。現在、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、および string concat 操作をすべて削除すると、完了します。(もちろん、そこにそれらが必要です。)
printfn、sprintfn、および string ops はスレッドセーフではありませんか?
別の編集: 反復は常に最後の項目で停止します。したがって、入力配列に 15 個の項目がある場合、処理は項目 14 で停止するか、項目 15 に到達しないようです。その後、すべてがハングします。入力配列のサイズは関係ありません..これを引き起こしている可能性のあるアイデアはありますか? Parallel.ForEach (Array.Parallel の代わりに) に切り替えても、同じ動作をしました。