Używam aplikacji Clojure do uzyskiwania dostępu do danych z internetowego interfejsu API. Będę wysyłać wiele żądań, a wiele żądań będzie prowadzić do kolejnych żądań, więc chcę zachować adresy URL żądań w kolejce, która pozostawi 60 sekund między kolejnymi pobraniami.Kolejki pracy w Clojure
Po this blog post Ja to razem:
(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))
Gdybym obejmują (future (process-queue-item (take! my-queue)))
w moim kodu gdzieś potem na REPL mogę (offer! my-queue "something")
i widzę coś ">>" drukowane natychmiast. Jak na razie dobrze! Ale potrzebuję, aby kolejka trwała przez cały czas, gdy mój program jest aktywny. Wywołane wcześniej wywołanie (future ...)
działa w celu wyciągnięcia jednego elementu z kolejki, gdy tylko będzie dostępny, ale chcę czegoś, co będzie stale oglądać kolejkę i zadzwonić pod numer process-queue-item
, gdy tylko coś będzie dostępne.
Ponadto, w przeciwieństwie do zwykłego zamiłowania Clojure do współbieżności, chcę się upewnić, że tylko jedna prośba jest wykonywana w tym samym czasie i że mój program czeka 60 sekund na wykonanie każdego kolejnego żądania.
Myślę, że jest to ważne, ale nie wiem, jak to dostosować, aby robić to, co chcę. Jak bez przerwy odpytywać kolejkę i upewnić się, że tylko jedno żądanie jest uruchamiane jednocześnie?
Dlaczego chcesz sondować ciągle, ale wysyłać co 60 sekund? Czy odpytywanie raz na 60 sekund dokona tego samego? – mamboking
@mamboking Prawie, tak. Jedynym minusem tego podejścia byłoby dodanie pierwszego elementu do kolejki: jeśli program zajmie pięć sekund, aby dowiedzieć się, jaki będzie pierwszy adres URL żądania, po prostu będzie siedział tam przez 55 sekund, dopóki kolejka nie zostanie sprawdzona. Program i tak będzie dość długi, więc myślę, że to nie jest problem. – bdesham
Czy unikasz planowania zadań? Na przykład ten, https://github.com/zcaudate/cronj (jest tam również lista innych bibliotek w readme tego repo) – georgek