チュートリアルで提供されているように、OWIN を使用して、Hangfire を Web アプリの一部として実行するように構成しました。
提供する API を介して、実行時間の長いバックグラウンド プロセスをキューに入れます。実行するジョブは、.Net Process クラスを使用してバックグラウンドで R プロセスを初期化します。R コードは、ジョブをより速く完了するために、内部的に多数のプロセスを生成します。ジョブが実行されると、タスク マネージャーで多数の Rscript プロセスが実行されます。
Web アプリのアプリ プールを手動でリサイクルすると (プロセスの再起動がどのように機能するかを確認するため)、Rscript プロセスは強制終了されません。コード内のすべての Rscript プロセスを取り除くためのカスタムの kill 戦略があります。
while (IsNotTimedOut())
{
try
{
_token.ThrowIfCancellationRequested();
Thread.Sleep(2000);
}
catch (OperationCanceledException)
{
Kill();
throw;
}
}
kill メソッド内で、Process.WaitForExit() メソッドを使用してブロックします。
手動リサイクルを行うと、すべてのプロセスが強制終了されません。プロセスの強制終了をブロックする代わりに、現在のスレッドは、いくつかの Rscript プロセスを強制終了した後に終了します。
hangfire コードはトークンをキャンセルするだけのようで、キャンセル トークンをリッスンしているプロセスが強制終了されるのを待っているようには見えません。誰かがこれを機能させる方法を提案できますか? 詳細が必要な場合はお知らせください。