Estoy usando una aplicación Clojure para acceder a los datos de una API web. Voy a hacer muchas solicitudes, y muchas de las solicitudes darán lugar a que se realicen más solicitudes, por lo que quiero mantener las URL de solicitud en una cola que dejará 60 segundos entre descargas posteriores.Colas de trabajo en Clojure
Siguiendo this blog post puse esto juntos:
(def queue-delay (* 1000 60)) ; one minute
(defn offer!
[q x]
(.offerLast q x)
q)
(defn take!
[q]
(.takeFirst q))
(def my-queue (java.util.concurrent.LinkedBlockingDeque.))
(defn- process-queue-item
[item]
(println ">> " item) ; this would be replaced by downloading `item`
(Thread/sleep queue-delay))
Si incluyo un (future (process-queue-item (take! my-queue)))
en mi código en algún lugar entonces en el REPL que pueda (offer! my-queue "something")
y veo el ">> algo" impreso inmediatamente. ¡Hasta aquí todo bien! Pero necesito que la cola dure todo el tiempo que mi programa esté activo. La llamada (future ...)
que acabo de mencionar funciona para sacar un elemento de la cola, una vez que esté disponible, pero quiero algo que mire continuamente la cola y llame al process-queue-item
siempre que haya algo disponible.
Además, contrariamente al amor habitual de Clojure por la concurrencia, quiero asegurarme de que solo se realice una solicitud a la vez y que mi programa espere 60 segundos para realizar cada solicitud posterior.
Creo que this Stack Overflow question es relevante, pero no estoy seguro de cómo adaptarlo para hacer lo que quiero. ¿Cómo consulto continuamente mi cola y me aseguro de que solo se ejecute una solicitud a la vez?
¿Por qué quiere sondear continuamente pero solo envía cada 60 segundos? ¿Las encuestas solo una vez cada 60 segundos lograrían lo mismo? – mamboking
@maboking Casi, sí. El único inconveniente de ese enfoque sería agregar el primer elemento a la cola: si al programa le toma cinco segundos descubrir cuál será la primera URL de solicitud, se quedará allí durante 55 segundos hasta que se compruebe la cola. El programa será bastante largo de todos modos, así que supongo que no es un problema. – bdesham
¿está evitando un programador de tareas? Por ejemplo, este, https://github.com/zcaudate/cronj (también hay una lista de otras bibliotecas en el archivo Léame de ese repositorio) – georgek