問題タブ [mailboxprocessor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
150 参照

f# - F# 3.0: System.Exception: メールボックスの複数の待機中のリーダーの継続

私はいくつかの MailboxProcessor テストを実行しようとしていますが、メールボックス Scan() が「System.Exception: 複数のメールボックスのリーダーの継続を待っています」で失敗するようです。これは、Async.Start や Async.StartImmediate などで発生します (Async.RunSynchronously も機能しません。最初の顧客の後にプロセッサが 1 つしかなく、顧客がいないためです)。

ここにデモコードがあります。これはインタラクティブに動作します:

...そして、しばらく実行した後に取得するスタックトレースは次のとおりです。

またはスレッドなしで同じ:

0 投票する
1 に答える
362 参照

f# - F# MailboxProcessor と機能設計

状態が機能にとって悪い考えと見なされる場合、MailboxProcessor を使用するときに状態を使用しても問題ないと見なされるのはなぜですか?

拡張するために、私は誰かに関数型プログラミング、関数が状態を使用しない方法 (関数の外側に変数がない - つまり、同じデータ入力に対して同じデータ出力) と、これがもたらす良いことを説明していました。しかし、その後、MailboxProcessor と、それが再帰を使用して関数呼び出し間で状態を維持する方法について考え始めましたが、そのような状況でなぜそれが問題ないのか、完全には理解できません。

それは、状態を永続化する最も悪い方法であるということですか?

0 投票する
0 に答える
251 参照

f# - mailBoxProcessor が receive メソッドで停止するのはなぜですか?

F# mailBoxProcessor を使用して、複数のネットワーク エンドから受信したメッセージを非同期的に処理しています。

inbox.receive() の後に関数呼び出し getTreasuryYield を追加するまで、コードは期待どおりに機能します。

数秒間実行した後、毎回 inbox.receive() でスタックします。

GetTreasuryYield は、データベースと IO 操作を伴うため、非常に遅いメソッドですが、私は

それがどのようにスタックするかはまだわかりません。

どんなヘルプでも大歓迎です。

0 投票する
0 に答える
100 参照

asynchronous - メールボックス プロセッサのスレッド化エラーでの F# クロージャ

そのため、本で非常にCPUを集中的に使用するバッチ計算を行っています。そして、タスクの計算を追跡するためのトラッカーを作成しました。並列化なしですべて正常に動作するメールボックス プロセッサを閉じますが、array.parallel.map または非同期ワークフローを配置すると、メールボックス プロセッサが失敗します。なぜ知りたいのですか?

0 投票する
2 に答える
303 参照

asynchronous - 失敗後に MailboxProcessor を再起動しますか?

クラスを介して F# でエージェントの操作を開始しようとしてMailboxProcessor<'Msg>いますが、例外を適切に処理していないことにすぐに気付きました。Haskelly の世界では、例外は存在しないため、問題を処理する適切な方法は、単純に応答ケースとして提供することです。そのため、エージェントは次のように返信できます。

.PostAndReplyその後、エージェントのメソッドを呼び出してInvalidData、データが無効である理由を示すメッセージを含む を取得できます。ただし、これは Haskell ではないため、例外が発生することがあります。だから私がこれを行うと:

2 回目の呼び出しはagent.PostAndReply無期限にブロックします。を使用せずに呼び出すAsyncReplyChannelだけagent.Postの場合、呼び出しはブロックされませんが、エージェントが例外に遭遇すると、新しいメッセージはキューに残ります。どちらの場合も、エージェントを再起動することは不可能に見えます。agent.Start関数が再度呼び出されたときに を返すためInvalidOperationExceptionです。これを処理する自然な方法は、クリーンな状態で新しいエージェントを作成することですが、キューに入れられたすべてのメッセージが失われます。

エージェントの本体全体を でラップするだけでなくtry..with、例外の後もエージェントを実行し続けるための良い方法はありますか? あるいは、これに対処する「標準的な」方法が確立されており、誰かが私を指摘できますか?

0 投票する
1 に答える
725 参照

f# - F#、MailboxProcessor、および Async の実行が遅いですか?

バックグラウンド。

MailboxProcessor を把握しようとしています。アイデアは、ある種のステート マシンとして使用し、ステート間で引数を渡し、終了することです。一部の部分は非同期通信を行う予定なので、そこで Sleep を作成しました。これはコンソール アプリケーションです。メイン スレッドが終了し、その背後にあるすべてのものを強制終了するため、Post を作成しても何もしません。メインで PostAndReply を作成しています。また、私はなしで試しました

、違いはありません。

質問。

(多分私は何か間違ったことをしている)

  1. Go24 は非同期ではありません。RunSynchronously を StartImmediate に変更しても、目に見える違いはありません。代わりに、末尾は GetMe の下のどこかにあるはずです。同時に、Fetch の後に Done が出力されます。スリープ時に制御がメインスレッドに戻されるはずがありませんか?

    Go24、待って go24 1、フェッチを終了 1 完了 GetMe ...

  2. 実行時間はひどく遅いです。Fetch の遅延なしで、約 10 秒 (ストップウォッチ) です。F# スレッドは軽量であり、threadpool を使用する必要があると考えました。デバッガーによると、すべてを作成するのに appr 1 秒かかり、実際のスレッドのように見えます。

また、[1..100] に変更すると、100 秒間プログラムが「一時停止」されます。ProcessExplorer によると、その間に 100 のスレッドが作成され、その後すべてが出力されます。私は実際には、より少ないスレッドとゆっくりとした増加を好みます。

コード。

Program.fs

メールボックス.fs

0 投票する
3 に答える
1101 参照

performance - 同期時の F# Akka.NET エージェントのパフォーマンスの最適化

次の問題を解決しようとしています。数ミリ秒の大きなハートビートでリアルタイムで実行されているエージェントがいくつかありますが、この理由でエージェントが処理する操作の順序はほとんど決定論的です (メッセージ処理がボトルネックではないため)。

現在、ハートビートがなくなったシステムの大量のシミュレーションを実行しています (そうでなければ、数世紀かかります)。ただし、操作の順序が保持されていることを確認する必要があります。このために、私は次の解決策を採用しました。シミュレーターは、ダミーの同期メッセージを投稿し、応答を待っている間にブロックすることで、各エージェントがメッセージ キューを処理したことを確認します。これは私のアプリケーションでは機能しますが、かかる時間は直感的ではありません-シングルスレッドの実装は桁違いに高速になるためです(テストしていませんが、x 100程度だと思います)。

別のライブラリ akka.net を使用しようとしても、問題を示す小さなテストを分離しました

基本的に、どちらもわずか 100 万回の同期に約 10 秒かかります。これは計算に関係なく、残念なことです。

誰かが同じ問題に遭遇したかどうか、そしてオーバーヘッドをオフにしてすべてをシングルスレッドモードで実行させる方法があるかどうか疑問に思っています...すべてのCPUを非アクティブ化するよりも優れていますが、BIOSで1つ-またはエージェントなしでシステム全体のクローンを作成します。

どんな助けでも大歓迎です。