問題タブ [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.
user-interface - レスポンシブUIを使用して非同期キャンセル可能ワークフローでデータを準備する適切な方法
この質問はAsync.TryCancelledがAsync.RunSynchronouslyで機能しないことに基づいています。これは複雑に見えるので、解決しようとする単純な部分を切り取ります。
私がこの関数を持っているとしましょう:
prepareModel
ユーザーに表示する必要のあるデータを準備します。updateUI
UIを更新します(古いコントロールを削除し、新しいデータに基づいて新しいctlを作成します)。
質問:prepareModel
いつでもキャンセルできるように、2つの関数をどのように呼び出す必要がありますか?
流れは
- ユーザーが[更新]をクリックします
prepareModel
(1)開始され、非同期で実行されているため、UIは応答性が高く、ユーザーはアプリケーションを操作できます
- ユーザーがデータを変更し、[更新]をもう一度クリックします
prepareModel
(1)fromがキャンセルされ、newprepareModel
(2)が開始されます
- ユーザーがデータを変更し、[更新]をもう一度クリックします
prepareModel
(2)がキャンセルされ、新しいprepareModel
(3)が開始されます- ..
prepareModel
(n)終了updateUI
UIスレッドで実行され、UIを再描画します
(私の最初の解決策は、1つだけが実行されるMailboxProcessor
ことを保証することに基づいています。Async.TryCancelledはAsync.RunSynchronouslyでは機能しませんが、これを実験したので、バグはありません)prepareModel
asynchronous - AsyncおよびCancellationTokens/CancellationTokenSourceメモリの問題
私はまだメモリリークハントを続けており、次のことに気づきました。
System.Threading.CancellationCallbackInfoのライブインスタンスがたくさんあります-F#のデフォルトからのオブジェクト-CancellationTokenSource(Async-Workflows)。
自分でソースを宣言し、これをMailboxProcessor内で使用して子またはタスクにまたがる場合、問題はさらに悪化します。
CancellationTokenSourceが次のような参照を保持しているため、GCはこれらのスパンされたタスク/ワークフローを収集できないようです。
これらのCancellationCallbackInfo-ObjectsのほとんどはGen2に到達します-MailboxProcessors内でローカル参照を使用するだけなので信じられないほどです-「ループ」ワークフロー...
これは既知の問題ですか?解決策/回避策はありますか?
今のところ、Cancellation-supportの使用をやめ、ManualResetEventsをこのコードに通します...まったく良くありません:(
f# - メールボックスプロセッサへのメッセージの到着順序
ありますか / メールボックス プロセッサに送信されたメッセージの到着順序を保証するにはどうすればよいですか
つまり、スレッド上で行う場合
エージェントの処理ループで、メッセージが順番に受信されることを確認するにはどうすればよいですか?
multithreading - Async.Start のコスト
メールボックス プロセッサ ループで、以前にそのようなコレクションに格納されていたブロッキング コレクション アイテムから読み取りました。このようなコレクションへの書き込みには同じループを使用するため、スレッドとして起動する必要があります。
私のコード全体の実行は遅く(比較的言えば)、原因は起動した新しいスレッドであると思われますが、スレッドプールをキックスタートしました
競合ポイントがここにある可能性を示すもう 1 つのヒントは、キューが空のときにのみ起動する (そしてセクション全体をロックする) 場合、実行時間は 350 ミリ秒から 7 秒まで大きく変化し、そうでない場合は約 5 秒になるということです。 10秒。
私の質問は次のとおりです。
- とにかく、ここでスレッドの作成を加速できますか
- メールボックスプロセッサ内で使用できる、この種の状況 (消費者/生産者?) をすでに処理する構造はありますか?
wcf - f#で長時間実行されているエージェント
私はさまざまな方法でエージェントを使用しています。そのうちの1つは、Webサイトの変更を監視する100人のエージェントで構成され、スーパーバイザーに報告して、新しいモニターを生成したり、マージされた変更をリッスンしたりできます。これは私のプログラムの一部に過ぎず、満足しています。私は今それをスピンオフしたいと思います、そしてそれは私のメインプログラムから本当に独立して実行されます。
(それでも、この独立したスピンオフを言語内にできるだけ多く残し、可能な限り最小限のグルーコードを使用することを望みます)
ここにはどのような戦略がありますか/お勧めしますか?
f# - MailboxProcessor がハングするのはなぜですか?
への呼び出しで次のコードがハングする理由がわかりませんGetTotal
。MailboxProcessor 内でデバッグできないようで、何が起こっているのかわかりにくいです。
Aggregator
クラスにラップするのではなく、同一の MailboxProcessor を直接使用するとうまくいくようです。
f# - MailboxProcessor と例外
MailboxProcessor
例外を処理するためのデフォルトの戦略が、黙ってそれらを無視するのはなぜだろうか。例えば:
そして何も起こりません。プログラムの実行が致命的に停止したり、「ハンドルされていない例外が発生しました」というメッセージ ボックスが表示されたりすることはありません。何もない。
誰かがPostAndReply
メソッドを使用すると、この状況はさらに悪化します。結果としてデッドロックが保証されます。
そのような行動の理由はありますか?
f# - 統合タスクおよび F# MailboxProcessor 例外処理
Task<T> を使用すると、タスクの実行中に Task.Wait(); 中に例外がスローされます。F# の MailBoxProcessor を使用すると、例外が飲み込まれ、この質問に従って明示的に処理する必要があります。
この違いにより、タスクを介して F# エージェントを C# コードに公開することが困難になります。たとえば、このエージェント:
C# から呼び出すことはできますが、例外は C# に返されません。
例外を取得する代わりに、C# コードは task.Wait() でハングするだけです。F# エージェントをタスクのように動作させる方法はありますか? そうでない場合、F# エージェントを他の .NET コードに公開する用途は限られているようです。
f# - 怠惰な..しかしF#の熱心なデータローダー
次の主題に関する「先行技術」を知っている人はいますか。
- 読み込みにかなりの時間がかかるデータがあります。それらは様々な株の歴史的なレベルです。
- アプリを使用する際のレイテンシーを回避するために、何らかの方法でそれらをプリロードしたいと思います
- ただし、開始時にそれらを1つのチャンクにプリロードすると、最初にアプリが応答しなくなり、ユーザーフレンドリーではなくなります
だから私は自分のデータをロードしたくない....ユーザーが何も要求しておらず、すでに持っているもので遊んでいない限り、その場合は少しずつ取得したいと思います。つまり、「怠惰」でも「熱心」でもありません。「必要なときに怠惰」であり、「できるときに熱心」であるため、頭字語はLWYNEWYCです。
私はうまくいくように見える次のことをしました、しかし私はそのようなことのために認められて祝福されたアプローチがあるかどうかだけ疑問に思いますか?
そしてクラス
exception - F#MailboxProcessor-メールボックスの複数の待機中のリーダーの継続
本当に単純な非同期テストフレームワークのようなものを書いて遊んでいます。しかし、私はある種の制限やバグにぶつかっていると思います。申し訳ありませんが、これを小さなコードベースで再現することはできませんでした。
これは私が思いついた基本的なフレームワークです:
これで、例外がトリガーされるのは、Web上でクロールを実行する特定のテストセットを使用した場合のみです(失敗するものと失敗するものがあります)。
https://github.com/matthid/Yaaf.GameMediaManager/blob/core/src/Yaaf.GameMediaManager.Primitives/EslGrabber.fsがコードであり、https://github.com/downloads/matthid/Yaafをダウンロードできます。 GameMediaManager / GameMediaManager。%200.9.3.1.wireplugin(これは基本的に名前が変更されたzipアーカイブです)そしてそれを抽出してYaaf.GameMediaManager.Primitives.dllバイナリを取得します(必要なときにダウンロードする代わりにFSIに貼り付けることができますが、 HtmlAgilityPackを参照するには)
これは、Microsoft(R)F#2.0 Interactive、ビルド4.0.40219.1で再現できます。問題は、例外が常に(ただし非常に頻繁に)トリガーされるわけではなく、スタックトレースが何も通知しないことです。
これは、私が制御できないワーカースレッドでトリガーされるため、アプリケーションがクラッシュします(FSIではなく、例外がここにも表示されます)。
http://cs.hubfs.net/topic/Some/2/59152とhttp://cs.hubfs.net/topic/None/59146を見つけましたが、StartChildを使用しておらず、どういうわけか同時に複数のスレッドからReceiveを呼び出す?
私のコードに何か問題がありますか、それともこれは本当にバグですか?可能であれば、どうすればこれを回避できますか?
FSIでは、例外が黙って無視されると、すべてのテストが期待どおりに実行されることに気付きました。どうすれば同じことができますか?
編集:失敗したユニットテストを修正した後、正しく動作することに気づきました。ただし、これを小さいコードベースで再現することはできません。たとえば、私自身の失敗したテストで。
ありがとう、matthid