web-dev-qa-db-ja.com

「長時間実行タスク」とはどういう意味ですか?

既定では、CLRはプールされたスレッドでタスクを実行します。これは、短期間の計算にバインドされた作業に最適です。長時間実行およびブロック操作の場合、次のようにプールされたスレッドの使用を防ぐことができます。

Task task = Task.Factory.StartNew (() => ...,
TaskCreationOptions.LongRunning);

threadtaskに関するトピックを読んでいます。 「長時間実行」タスクと「短期実行」タスクとは何か説明していただけますか?

22
Person.Junkie

一般的なスレッドプールでは、起動時間と実行時間の比較に基づいて、実行時間の短いスレッドと実行時間の長いスレッドを区別します。

スレッドは通常、作成されてコードの実行を開始できるようになるまでにsome時間がかかります。

つまり、開始に1分かかるが、1秒しか実行されないスレッドを多数実行すると(正確な時間ではありませんが、ここでの目的は単に関係を示すことです)、それぞれの実行時間は次のようになります。そもそもそれらを実行するのにかかる時間。

これが、singスレッドプールの理由の1つです。スレッドは、作業が完了すると終了しません。代わりに、再利用するためにぶらぶらしているので、起動時間が再び発生することはありません。

したがって、その意味で、長時間実行されているスレッドとは、実行時間が開始に必要な時間よりもはるかに長いスレッドのことです。その場合、起動時間は、実行時間の短いスレッドの場合よりもはるかに重要ではありません。

逆に、実行時間が短いスレッドとは、実行時間が起動時間以下であるスレッドです。


特に.NETの場合、操作が少し異なります。スレッドプールコードは、スレッドの最小数に達すると、スレッドの作成を0.5秒に1回に制限しようとします。

したがって、knowスレッドが長時間実行される場合は、それに応じてスレッドが調整できるように、スケジューラーに通知する必要があります。これはおそらくプールからスレッドを取得するのではなく、単にnewスレッドを作成することを意味します。これにより、プールは意図したとおりに短期間のタスクを処理することができます(その動作ですが、そのようにすることは理にかなっています)。

ただし、それは長期実行と短期実行の意味を変更しません。つまり、2つを区別するのに意味のあるしきい値があるということです。 。 .NETの場合、0.5秒の数字が適切な選択になることをお勧めします。

19
paxdiablo