Sto utilizzando un'applicazione Clojure per accedere ai dati da un'API Web. Farò molte richieste e molte richieste porteranno a fare più richieste, quindi voglio mantenere gli URL delle richieste in una coda che lascerà 60 secondi tra i download successivi.Code di lavoro in Clojure
seguito this blog post ho messo questo insieme:
(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))
Se includo un (future (process-queue-item (take! my-queue)))
nel mio codice da qualche parte poi al REPL posso (offer! my-queue "something")
e vedo il ">> qualcosa" stampato immediatamente. Fin qui tutto bene! Ma ho bisogno che la coda duri per tutto il tempo in cui il mio programma è attivo. La chiamata (future ...)
che ho appena menzionato funziona per estrarre un elemento dalla coda, una volta disponibile, ma voglio qualcosa che guardi continuamente la coda e chiami process-queue-item
ogni volta che qualcosa è disponibile.
Inoltre, contrariamente al solito amore Clojure per la concorrenza, voglio assicurarmi che venga fatta una sola richiesta alla volta e che il mio programma attenda 60 secondi per effettuare ogni richiesta successiva.
Penso che this Stack Overflow question sia rilevante, ma non sono sicuro di come adattarlo per fare ciò che voglio. Come si esegue il polling continuo della coda e ci si assicura che venga eseguita una sola richiesta in una sola volta?
Perché si desidera eseguire il polling in modo continuo ma inviare solo ogni 60 secondi? Il polling solo una volta ogni 60 secondi porta a termine la stessa cosa? – mamboking
@mamboking Quasi, si. L'unico svantaggio di questo approccio sarebbe l'aggiunta del primo elemento alla coda: se il programma impiega cinque secondi per capire quale sarà l'URL della prima richiesta, rimarrà seduto per 55 secondi fino a quando la coda non sarà spuntata. Il programma sarà comunque piuttosto lungo, quindi penso che non sia un problema. – bdesham
stai evitando un task scheduler? Per esempio, questo, https://github.com/zcaudate/cronj (c'è anche un elenco di altre librerie nel readme di quel repository) – georgek