ある間隔でデータベースをポーリングしたいと思います。サーバの負荷を避けるために、重複する実行を回避することが主な関心事です。と、時間軸上で均等に間隔を空けて実行することはありません。;これはナイーブタイマー方式では他に発生します。実行間隔を固定したスカラスケジューリング
違う言い方:実行の終わりと次の開始時刻との間隔を一定にしたいと思います。
俳優たちが持っているコードの定型句のせいで、私はこれを試してみました。たぶん、より良い、あるいはもっと簡単な方法があります。
/*
* Infinite scheduling for acquiring a database snapshot at an almost fixed interval.
* The actual effective acquisition interval is (duration of the acquisition + dbSyncIntervalSecs)
*/
import scala.concurrent.duration._
import scala.concurrent.blocking
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val system = ActorSystem("MySystem") // make global if more things hinge on the actor system
val interval = Configuration.dbSyncIntervalSecs
private def acquireLoop: Unit = {
Future {
blocking {
println("about to sync from database")
acquire
}
}
system.scheduler.scheduleOnce(interval seconds)(acquireLoop)
}
アドバイスはありますか?
スレッドプールは、しかし、健康になります。
また、私はより良い、この継続的なプロセスのために、特定の種類の個別の実行コンテキストを使用するのではなく、blocking
イディオムでデフォルト1を背負う必要がありますか?
ありがとうございます!
お役立ち情報私はまだ遅いものが終了した直後にタイマーに次の呼び出しを実行させるのではなく、終了時間の間に一定間隔を置くことを好みます。私は常に呼び出しを均等に配置したいと思います。だから、私はそれを見ているように、これは問題を避けているようには見えません。 – matanster
@matanster:OK、時間がかかりすぎる* _ _ runs_も問題があります。 –
正解、申し訳ありません。私は今、その意図を明示的に中心にして質問を編集しました。関連ドキュメントの引用の前に非常に暗黙のうちに申し訳ありません! – matanster