3

メソッド呼び出しの頻度を制限するために、Scala で RateLimiter を使用したいと考えています。

Guava の実装に似たものが必要です: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/RateLimiter.html

Guava をネイティブに使用できることはわかっていますが、Akka の有無にかかわらず、Scala でより優れたネイティブ ソリューションがあるかどうかを知りたいです。

4

2 に答える 2

5

個人的にはグァバを使います。しかし、先物を使用すると、あまり苦労せずに独自のものを作成できます。

class RateLimiter(delayMs: Int) {
  private[this] var last: Long = System.currentTimeMillis
  private[this] val done = scala.actors.Futures.alarm(0)
  def request = {
    val now = System.currentTimeMillis
    val elapsed = synchronized {
      val elapsed = now - last
      last = if (elapsed < delayMs) last+delayMs else now
      elapsed
    }
    if (elapsed < delayMs) scala.actors.Futures.alarm(delayMs-elapsed)
    else done
  }
}

次に、アクセスを制限する各メソッドまたはメソッドのセットに対してリミッタを作成し、 への呼び出しでメソッドを開始しrequest()ます。これは、必要に応じて a を使用しFutureてブロックします。少なくとも数ミリ秒の間隔以外のものが必要な場合は、少し計算を変更するか、もう少し状態を追跡する必要があります。

于 2012-09-27T13:10:13.980 に答える