Mit der throttle-queue wird ein bestimmter Codeblock nur x mal pro Sekunde ausgeführt. Das ist besonders praktisch für ausgehende Apiabfragen, wenn z.B. wie bei Amazons Produktapi regulär nur eine Anfrage pro Sekunde rausgeschickt werden darf und sonst der Zugang blockiert wird.
require 'throttle-queue'
class AmazonApi
def initialize()
begin
@@throttle # have only one throttle for all objects
rescue
@@throttle = ThrottleQueue.new 1 # 1 request per second
…
end
end
def search(keyword)
result = "" # temporary variable because we can't return in the queue
@@throttle.foreground(rand) { # random id, so new requests don't replace waiting requests
result = @@api.item_search query: { … }
}
return result
end
Alternativ könnte man den Codeblock auch im Hintergrund ausführen lassen, was je nach Anwendungsfall sehr praktisch sein kann.
Es ist ein relativ neues Gem, das erst seit November 2014 auf Github existiert. In meinen Tests funktionierte es einwandfrei und schien wie beworben thread-safe zu sein. Eine schöne Überraschung, so etwas überhaupt und dann noch ohne Abhängigkeit von eventmachine zu finden.
onli blogging am : Ruby: Mit LruRedux schnell und effizient cachen
Vorschau anzeigen