Tôi đang sử dụng ứng dụng Clojure để truy cập dữ liệu từ API web. Tôi sẽ thực hiện rất nhiều yêu cầu và nhiều yêu cầu sẽ dẫn đến nhiều yêu cầu hơn, vì vậy tôi muốn giữ URL yêu cầu trong hàng đợi sẽ để lại 60 giây giữa các lần tải xuống tiếp theo.Hàng đợi công việc trong Clojure
Sau this blog post tôi đặt này với nhau:
(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))
Nếu tôi bao gồm (future (process-queue-item (take! my-queue)))
trong mã của tôi ở đâu đó sau đó tại REPL tôi có thể (offer! my-queue "something")
và tôi xem ">> cái gì đó" in ngay lập tức. Càng xa càng tốt! Nhưng tôi cần hàng đợi để tồn tại trong suốt thời gian chương trình của tôi hoạt động. Cuộc gọi (future ...)
Tôi vừa đề cập đến công việc để kéo một mục ra khỏi hàng đợi, khi có sẵn, nhưng tôi muốn một thứ sẽ liên tục xem hàng đợi và gọi process-queue-item
bất cứ khi nào có sẵn.
Ngoài ra, trái với tình yêu Clojure thông thường, tôi muốn đảm bảo rằng chỉ có một yêu cầu được thực hiện tại một thời điểm và chương trình của tôi chờ 60 giây để thực hiện từng yêu cầu tiếp theo.
Tôi nghĩ rằng this Stack Overflow question là có liên quan, nhưng tôi không chắc chắn cách điều chỉnh nó để thực hiện những gì tôi muốn. Làm cách nào để thăm dò ý kiến hàng đợi của tôi liên tục và đảm bảo rằng chỉ có một yêu cầu đang được chạy cùng một lúc?
Tại sao bạn muốn thăm dò ý kiến liên tục nhưng chỉ gửi 60 giây một lần? Cuộc thăm dò ý kiến chỉ một lần mỗi 60 giây sẽ đạt được điều tương tự? – mamboking
@mamboking Hầu như, có. Nhược điểm duy nhất của phương pháp đó sẽ là thêm mục đầu tiên vào hàng đợi: nếu nó mất chương trình năm giây để tìm ra URL yêu cầu đầu tiên sẽ là gì thì nó sẽ chỉ ở đó trong 55 giây cho đến khi hàng đợi được kiểm tra. Tuy nhiên, chương trình sẽ hoạt động khá lâu vì vậy tôi đoán đó không phải là vấn đề quá nhiều. – bdesham
bạn có đang tránh một công cụ lập lịch biểu tác vụ không? Ví dụ: https://github.com/zcaudate/cronj (cũng có danh sách các thư viện khác trong readme của repo đó) – georgek