問題タブ [task-parallel-library]
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.
c# - CancellationTokensはAppDomain間で使用できますか
.NET 4では、協調キャンセルを適切にサポートするためにいくつかのタイプが導入されました。別のAppDomainで実行されている操作をキャンセルできるようにしたいと思います。CancellationTokenタイプは構造体です。別のAppDomainに渡すと、通常どおり機能しますか?
.net-4.0 - タスク並列ライブラリは、ターミナルサーバーまたはWebアプリケーションでどのように拡張できますか?
Parallel.Forや同様の構造を実行する場合、TPLはタスクにワークスティーリングキューを使用することを理解しています。
これを正しく理解していれば、コンストラクトはいくつかのタスクを起動し、それぞれがアイテムの処理を開始します。タスクの1つが割り当てられたアイテムを完了すると、まだ完了していない他のタスクからアイテムを盗み始めます。これにより、アイテム1〜100の処理が安価で、アイテム101〜200のコストが高く、2つのタスクの一方がもう一方が完了するまでアイドル状態になるという問題が解決されます。(私はこれが単純化された説明であることを知っています。)
ただし、これはターミナルサーバーまたはWebアプリケーションでどのように拡張されますか(Webアプリで実行されるコードでTPLを使用すると仮定)?アプリケーションのインスタンスがN個並んで実行されているという理由だけで、CPUがタスクで飽和するリスクを冒すことはできますか?
このトピックに関する私が読むべき情報はありますか?特に何も見つけていませんが、ないという意味ではありません。
c# - .NETタスクインスタンスは実行中にスコープ外になる可能性がありますか?
メソッドに次のコードブロックがある場合(.NET 4とタスク並列ライブラリを使用):
メソッドが返されると、そのタスクはスコープ外になり、ガベージコレクションされるのでしょうか、それとも完了するまで実行されるのでしょうか。GCingの問題には気づいていませんが、GCで競合状態に陥っていないことを確認したいと思います。
asynchronous - Task Parallel Library で非同期 I/O を実行するための提案
BeginRead
非同期プログラミング モデル (APM) のイディオム (例: / )を使用して C# で記述した高性能ファイル転送コードがありますEndRead
。このコードは、ローカル ディスクからファイルを読み取り、それをソケットに書き込みます。
最新のハードウェアで最高のパフォーマンスを得るには、可能な限り、複数の未処理の I/O 操作を実行しておくことが重要です。したがって、ファイルにいくつかの操作を投稿し、1 つが完了するとソケットでBeginRead
a を呼び出し、それが完了するとファイルで別の操作を行います。詳細はそれよりも少し複雑ですが、大まかに言えばそれがアイデアです。BeginSend
BeginRead
私は APM ベースのコードを動作させましたが、理解するのが非常に難しく、おそらく同時実行の微妙なバグがあります。代わりに TPL を使用したいと思います。Task.Factory.FromAsync
すぐにやろうと思ったのですが、落とし穴があります。
私が見たすべての I/O サンプル (特にStreamExtensions
Parallel Extensions Extras のクラス) は、1 回の読み取りと 1 回の書き込みが続くことを前提としています。これは私が必要とする方法を実行しません。
非同期 I/O タスクはワーカー スレッドに多くの時間を費やさないためParallel.ForEach
、Extras 拡張などの単純なものは使用できません。そのため、Parallel は別のタスクを開始するだけで、数十または数百の保留中の I/O 操作が発生する可能性があります。 Task.Factory.Iterate
; やりすぎ!タスクを ing することでこれを回避できWait
ますが、イベント ハンドル (カーネル オブジェクト) が作成され、ワーカー スレッドを拘束するタスク待機ハンドルで待機がブロックされます。私の APM ベースの実装では、これらの両方を回避しています。
複数の読み取り/書き込み操作を実行中のままにしておくためのさまざまな方法をいじっており、別のタスクを作成するメソッドを呼び出す継続を使用してそれを行うことができましたが、ぎこちなく感じ、間違いなくそうではありません慣用的な TPL。
TPL でこのような問題に取り組んだ人は他にいますか? 助言がありますか?
c# - Parallel ForEach内のオブジェクトに対するモックアサーション?
Parallel.ForEach内でクロージャを介してアクセスされているときに、モックオブジェクトをアサートする方法はありますか?各呼び出しは異なるスレッド上にあるため、Rhino Mocksはオブジェクトを追跡できなくなると思いますか?
擬似コード:
このテストは、スタブが5回呼び出されることを期待していますが、実際には0回呼び出されるという期待違反を返します。
スレッドローカルスタブオブジェクトを追跡するようにラムダに指示する方法はありますか?
c# - すべての Linq クエリで Plinq を使用しても問題ありませんか?
PLinqがより高価であることがわかった場合、PLinqは自動的に非並列Linqを使用することを読みました。そこで、(可能な場合) すべてに PLinq を使用して、ランタイムにどれを使用するかを決定させない理由を考えました。
アプリはマルチコア サーバーにデプロイされ、並列処理を処理するためのコードをもう少し開発しても問題ありません。
plinq をデフォルトとして使用することの落とし穴は何ですか?
random - 並列ループとランダムは奇妙な結果を生み出します
タスク並列ライブラリを使い始めたばかりで、興味深い問題に遭遇しました。私は何が起こっているのかについての一般的な考えを持っていますが、何が起こっているのかを理解するのを助けるために私より有能な人々からのコメントを聞きたいです。やや長いコードについてお詫びします。
ランダムウォークの非並列シミュレーションから始めました。
次に、並列ループでの最初の試みを書きました。
1コアのみを使用するように設定された仮想マシンで実行した場合、同様の期間が観察されましたが、実行は順番に処理されなくなりました。当然のことです。
デュアルコアマシンで実行したとき、状況は奇妙になりました。時間の改善は見られず、実行ごとに非常に奇妙な結果が見られました。ほとんどの実行の結果は-1,000,000(または非常に近い)になります。これは、Random.Nextが常に0準を返していることを示しています。
ランダムを各ループにローカルにすると、すべてが正常に機能し、期待される期間の改善が得られます。
私の推測では、問題はRandomオブジェクトがループ間で共有されており、何らかの状態があるという事実に関係していると思います。「失敗した並列」バージョンで期間が改善されていないのは、ランダムへの呼び出しが並列で処理されないためだと思います(並列バージョンは両方のコアを使用しますが、元のバージョンは使用しません) 。私が実際に得られない部分は、シミュレーション結果がそれらが何であるかという理由です。
私が抱えているもう1つの懸念は、各ループにローカルなランダムインスタンスを使用すると、同じシードで始まる複数のループが発生する可能性があることです(複数のランドムを時間的に近すぎる場合に発生する問題で、結果として同一になります)シーケンス)。
何が起こっているのかについての洞察は私にとって非常に貴重です!
c# - GetEnumeratorによってデッドロックが発生しますか?
私は最初の並列アプリケーションを書き始めています。IDataReader
このパーティショナーは、データソースから一度にプルchunkSize
するレコードを列挙します。
TLDR; バージョン
完全なコード
IEnumerable
渡されたオブジェクトをスレッドセーフにしたかったのですが( MSDNの例では、PLINQとTPLがそれを必要とする可能性があると想定しています)_ChunkLock
、下部近くのロックはスレッドセーフを提供するのに役立ちますか、それともデッドロックを引き起こしますか?ドキュメントから、ロックが解放されるかどうかはわかりませんでしたyeld return
。
また、私がやろうとしていることを実行する.netの機能が組み込まれている場合は、それを使用したいと思います。また、コードに他の問題が見つかった場合は、よろしくお願いします。
.net-4.0 - ParallelTaskLibraryを使用すると「foreach」が失敗する
次のコードは正しい数のファイルを作成しますが、すべてのファイルには最初のリストの内容が含まれています。誰かが私が間違ったことを見つけてもらえますか?
.net - .NETに組み込まれたバックグラウンドスケジューリングシステム?
そのようなシステムはないと思いますが、お願いします。
基本的に、将来のある時点(通常は数秒以内、場合によっては数分後)に実行するタスクをスケジュールし、手遅れにならない限り、その要求をキャンセルする方法を用意する必要があります。
つまり。次のようなコード:
.NETにそのようなシステムはありますか?TPLに私を助けることができるものはありますか?
ここでは、システム内のさまざまなインスタンスからそのようなfuture-actionsを実行する必要があります。むしろ、そのような各クラスインスタンスが独自のスレッドを持ち、これを処理することを避けたいと思います。
また、これ(または同様のタスクなど)は必要ないことに注意してください。
実行するそのようなタスクがいくつかある可能性があり、期限が近いことを除いて、特定の順序で実行する必要はありません。また、リアルタイムのパフォーマンスの概念のようなものを持っていることは重要ではありません。そのようなアクションごとに個別のスレッドをスピンアップすることは避けたいだけです。