アクターベースのソリューションがどのように増えているかを見て、APIとしてストックのMailboxProcessorのようなものを使用するF#ライブラリがないことに少し混乱しています。
欠点は何ですか?
制約された機能とラッパーのオーバーヘッドを処理するのはなぜですか?
実装の詳細の代わりにファーストクラスのAPIとしてエージェントを使用するF#APIはありますか?
desired副作用シナリオでの非ブロッキング並行性について話しています。特に、libがすでに内部でMailboxProcessorのようなものを使用しているが、通信プロトコルのラッパーを定義している場合(DUでうまく定義できます)。
上を通過するメッセージは見る人の目にあると思いますが、ErlangとScalaは、functionがActorsとうまく調和していることを示しています。Haskellの実装さえあるので、純粋な質問ではありません、しかしむしろスタイルの。
ラッパーが制約されていると言うとき、私は意味します:
プロトコルの複製(ラッパー+基礎となるメッセージング)。公開するのが1つの方法だけであれば問題ありませんが、多くの場合、そうではありません。
明示的な機能の複製(ファイアアンドフォーゲット、結果との非同期、同期など)。すべての可能性をラッパーでカバーすると、APIはカバーされないものの、不必要に肥大化することになります。実際には機能が削除されます。
非標準の動詞のセット。作成能力が低下します。
原則としてアクターに反対していないと仮定すると、非ブロッキング同時実行を含む実装の標準APIとしてMailboxProcessorを使用することの欠点は何ですか?
F#MailboxProcessor
は基本的に、シングルスレッドループの前にあるメモリ内キューです。これにより、状態の操作が必要な「並行」システムのプログラミングが確実に容易になりますが、次の欠点があります。
Actorモデルは、ステートフルプログラミングへの健全なアプローチです。必要な場合は、スレッドとロックを使用するアプローチよりもはるかに望ましいです。
ただし、F#はFunctional Firstプログラミング言語であり、私が遭遇したF#ライブラリのほとんどはそれを真剣に受け止めています。それらは、ステートフルプログラミングよりも副作用クエリを強調します。これにより、APIが驚異的並列になることがよくあります。恥ずかしいほど並行しているものがあれば、それを単一のスレッドに置く理由はありません。