6

2時間ごとに実行する必要があるプロセスがあります。これは、通常の処理を中断しないように、独自のスレッドで実行する必要があるプロセスです。

実行すると、100kレコードをダウンロードし、データベースと照合して検証します。これを実行するフレームワークには、このプロセスを管理する多くのオブジェクトがあります。これらのオブジェクトは、プロセスの実行中にのみ存在する必要があります。

より良い基準は何ですか?

  1. スレッドを再び必要になるまでスリープ状態にして、スレッドを待機モードに保ちます。または、

  2. 完了したら削除し、次に必要になったときに作成しますか?(システムタイマーイベント。)

4

13 に答える 13

9

2 つのソリューションに大きな違いはありません。スレッドが毎回作成されるものを好む傾向があります。

スレッドが横たわっていると、リソース(少なくともメモリ) が消費されます。ガベージ コレクション言語では、一部のオブジェクトをこのスレッドに保持するのが簡単な場合があるため、さらに多くのメモリを使用します。スレッドが配置されていない場合、すべてのリソースが解放され、メイン プロセスで 2 時間使用できるようになります。

スレッドが実行されているかどうかに関係なく、プロセス全体を停止する場合は、スレッドをきれいに中断する必要があります。スレッドを中断したり、スレッドがスリープしているか動作しているかを知ることは常に困難です。そこにいくつかの競合状態があるかもしれません。必要に応じてスレッドを開始すると、これらの潜在的な問題から解放されます。スレッドを開始したかどうかがわかり、その場合、呼び出すとthread_join、スレッドが完了するまで待機する必要があります。

これらの理由から、スレッド オン デマンド ソリューションを使用しますが、他のソリューションには克服できない問題はありません。

于 2008-12-04T16:06:24.330 に答える
4

2時間ごとに1つのスレッドを開始するのは非常に安いので、それを使用します。

ただし、将来のある時点で処理に実行間隔よりも多くの時間がかかる可能性がある場合は、スレッドを存続させておきたいと思うでしょう。そうすれば、最初のスレッドがまだ実行されている間にレコードの処理を開始する2番目のスレッドを作成することはなく、データが破損したり、レコードが2回処理されたりする可能性があります。

于 2008-12-04T15:56:52.820 に答える
3

どちらでも問題ないはずですが、検証に予想よりも時間がかかる場合(例:ネットワークリンクが遅い、データベースの応答が遅い)に備えて、スレッドを維持することに傾倒します。

于 2008-12-04T15:59:41.080 に答える
3

2 時間が経過したときに、新しいスレッドを開始することをどのように覚えていますか? タイマー付き?(それは別のスレッドにあります!)指定された時間までスリープする別のスレッドで?スレッドをシャットダウンし、別の場所で実行されている何かに基づいて再起動しても、別のスレッドが別のスレッドにある場合、または 2 時間が経過したときにワーカー スレッドを「作成」するのを待っている間にメイン アプリをブロックする場合は、役に立ちません。 、 番号?

スレッドをスリープさせてください...

于 2008-12-04T16:06:36.183 に答える
1

私はそれが主に好みの問題であるというVilxに同意します。両方の方法には処理とメモリのオーバーヘッドがありますが、どちらかが問題になるにはおそらく十分ではありません。

于 2008-12-04T15:52:41.923 に答える
1

Javaを使用している場合は、Timerクラスを確認できます。それはあなたが与えられた時間にタスクをスケジュールすることを可能にします。

また、より詳細な制御が必要な場合は、クォーツライブラリを使用できます。

于 2008-12-04T15:58:04.580 に答える
1

実際にスレッドをスリープ状態にするのが最も効果的だと思います。スレッドを終了して再作成すると、一部のリソースが「コスト」になりますが、スレッドをスリープ状態にすると、必要に応じてoperationgシステムによってデータがページングされる可能性がありますが、スケジューラーのスペースが少しいっぱいになります。 。

しかし、とにかくそれはおそらくそれほど大きな違いではなく、違いはおそらくOSのスケジューラーがどれだけ優れているかなどに依存するでしょう...

于 2008-12-04T15:59:47.587 に答える
1

私が言うことができるように、それは本当に1つのことに依存します...状態。

スレッドが、スレッド実行の次の反復中に保持するのに役立つ多くの状態を作成する (メモリを割り当てる) 場合は、それを保持します。そうすれば、最後の実行以降に特定のことが変更された場合にのみ特定の操作を実行することで、プロセスの実行を最適化できる可能性があります。

ただし、プロセスが作成する状態が、実行する作業の量と比較して重要であり、マシンのリソースが不足している場合は、実行間で状態を維持するコストに見合わない可能性があります。その場合は、毎回最初からスレッドを再作成する必要があります。

于 2008-12-04T19:15:58.143 に答える
0

ただの好みの問題だと思います。どちらも良いです。実装しやすい方を使用してください。:)

于 2008-12-04T15:50:52.707 に答える
0

スレッドを一度だけ作成し、イベント/条件変数を使用して、再度起動するように通知されるまでスレッドをスリープさせます。そうすれば、必要な時間を変更する必要がある場合でも、イベントを発生させるタイミングを変更するだけで済み、コードはきれいなままです。

于 2008-12-04T16:03:01.527 に答える
0

Java のようなガベージ コレクション システムを使用している場合に考慮すべきもう 1 つの重要な点は、スリープ スレッドによって強く参照されるものはガベージではないということです。その点で、アイドル状態のスレッドを強制終了し、それらとそれらが参照するすべてのオブジェクトをクリーンアップすることをお勧めします。

于 2008-12-04T19:44:40.567 に答える
0

あまり重要ではないと思いますが、最善のアプローチはプラットフォームに大きく依存します。

.NET System.Threading.Timer は、待機中にコストがかからず、プール スレッドでコードを呼び出します。理論的には、それはあなたの両方の提案の中で最高です。

于 2008-12-04T19:25:29.667 に答える
0

もちろん、それはすべて依存します。しかし、デフォルトでは、オンデマンドで開始される別のプロセス (スレッドではない) を使用します。

于 2008-12-04T20:36:12.817 に答える