2017-02-21 2 views
0

複雑な非同期計算を実行し、いつでも(計算外から)それらを中止できるようにする必要があります。いつでも非同期計算をキャンセルするには?

現在の実装では、scala.concurrent.Futureを使用して計算を実行します。しかし、実行中にスカラFutureをキャンセルする明白な方法はないようです。

プロミスを使用してcancellable Futureを実装するか、またはcancel()メソッドを持つjava.util.concurrent.Futureを使用するなど、この問題の推奨される解決策をいくつか見つけて試しました。

これらのすべてに同じ問題があります。実行は、Thread.sleep()呼び出しに達したときにのみ中止されます。

  1. 計算が可能な限り迅速に完了する必要があり:

    これは二つの理由で問題となっています。非常に短い睡眠期間を追加することは逆効果である。

  2. 私はこれらの計算の主な開発者ではないので、計算の実装に任意の制約を課す必要はありません。
+0

"実行はThread.sleep()に達したときにのみ中止されます。それは真実ではない。適切なコードに達すると、スレッドの割り込みステータスをチェックするたびに中断します。 – Kayaman

+0

中流の割り込みについて心配する必要がある場合は、計算が大きすぎるように思えます。あなたはどのような種類の作業負荷がどれくらい簡単に並列化されているかは言いません。 –

+0

@ChrisMowforth "mid-flow"割り込みの意味は?ワークロードの詳細については、単純な単語数から複雑なビデオフィルタやシミュレーションにいたるまでほとんど何もできなかったので、詳細については触れませんでした。これらの計算が実行される環境を提供しており、必要に応じてそれらを強制終了できなければなりません。これらの計算は第三者によって実施されます。 – DrummerB

答えて

3

スレッドを強制終了することはできません。唯一の計算を中止する安全な方法は、フラグをセットすること/フラグをチェックしてロジックを停止させることです。したがって、できるだけ速く計算を中止するには、中断されたフラグを可能な限り頻繁にチェックする必要があります。あなたの実行可能/呼び出し可能な実装でそれを達成すれば、望ましい結果が得られます。

関連する問題