私は最近、一連のスレッドを生成し、ブロックして 1 つの応答 (最初に到着した応答) を待機し、残りのスレッドをキャンセルしてからブロックを解除できると便利なケースに遭遇しました。
たとえば、シード値を取る検索関数があるとします。検索関数は自明に並列化できると規定しましょう。さらに、検索空間には多くの潜在的な解が含まれており、シード値によっては関数が無期限に検索しますが、少なくとも 1 つのシード値が適切な時間内に解を生成します。
次のように、完全に素朴に、この検索を並行して実行できれば素晴らしいと思います。
let seeds = [|0..100|]
Array.Parallel.map(fun seed -> Search(seed)) seeds
残念ながら、Array.Parallel.map
すべてのスレッドが完了するまでブロックされます。残念。検索機能でいつでもタイムアウトを設定できますが、その場合、最も長く実行されているスレッドが終了するまで待つことはほぼ確実です。さらに、問題によっては、タイムアウトが十分に長くない場合があります。
要するに、select()
任意の関数に対してのみ、UNIX ソケット呼び出しのようなものが欲しいのです。これは可能ですか?上記のようにかなりデータ並列の抽象化である必要はなく、F# コードである必要もありません。ネイティブ ライブラリを使用して、P/Invoke 経由で呼び出すこともできれば幸いです。