web-dev-qa-db-ja.com

F#MailboxProcessor別名エージェントとしてのAPI

アクターベースのソリューションがどのように増えているかを見て、APIとしてストックのMailboxProcessorのようなものを使用するF#ライブラリがないことに少し混乱しています。

欠点は何ですか?

制約された機能とラッパーのオーバーヘッドを処理するのはなぜですか?

実装の詳細の代わりにファーストクラスのAPIとしてエージェントを使用するF#APIはありますか?

desired副作用シナリオでの非ブロッキング並行性について話しています。特に、libがすでに内部でMailboxProcessorのようなものを使用しているが、通信プロトコルのラッパーを定義している場合(DUでうまく定義できます)。

上を通過するメッセージは見る人の目にあると思いますが、ErlangとScalaは、functionがActorsとうまく調和していることを示しています。Haskellの実装さえあるので、純粋な質問ではありません、しかしむしろスタイルの。

ラッパーが制約されていると言うとき、私は意味します:

  • プロトコルの複製(ラッパー+基礎となるメッセージング)。公開するのが1つの方法だけであれば問題ありませんが、多くの場合、そうではありません。

  • 明示的な機能の複製(ファイアアンドフォーゲット、結果との非同期、同期など)。すべての可能性をラッパーでカバーすると、APIはカバーされないものの、不必要に肥大化することになります。実際には機能が削除されます。

  • 非標準の動詞のセット。作成能力が低下します。

原則としてアクターに反対していないと仮定すると、非ブロッキング同時実行を含む実装の標準APIとしてMailboxProcessorを使用することの欠点は何ですか?

4

F#MailboxProcessorは基本的に、シングルスレッドループの前にあるメモリ内キューです。これにより、状態の操作が必要な「並行」システムのプログラミングが確実に容易になりますが、次の欠点があります。

  • 単一のスレッドでのみ実行されます
  • 同期からのオーバーヘッド

Actorモデルは、ステートフルプログラミングへの健全なアプローチです。必要な場合は、スレッドとロックを使用するアプローチよりもはるかに望ましいです。

ただし、F#はFunctional Firstプログラミング言語であり、私が遭遇したF#ライブラリのほとんどはそれを真剣に受け止めています。それらは、ステートフルプログラミングよりも副作用クエリを強調します。これにより、APIが驚異的並列になることがよくあります。恥ずかしいほど並行しているものがあれば、それを単一のスレッドに置く理由はありません。

4
Mark Seemann