2013-02-04 36 views
5

Kịch bản mà tôi cố gắng giải quyết là s sau, tôi có một chương trình thử nghiệm làm cho một trang web đến một điểm cuối web trên một hệ thống.Clojure thành ngữ để đồng bộ giữa các chủ đề

Chương trình thử nghiệm này có máy chủ web cầu nối đang chạy trên đó dự kiến ​​một cuộc gọi lại từ hệ thống bên ngoài hoàn thành chu kỳ kiểm tra thành công. Trong trường hợp không nhận được cuộc gọi lại trong một khoảng thời gian cụ thể (thời gian chờ), kiểm tra không thành công.

Để đạt được điều này, tôi muốn người chạy thử nghiệm chờ một "sự kiện" mà trình xử lý cầu nối sẽ đặt khi gọi lại.

Tôi đã nghĩ đến việc sử dụng CyclicBarrier của java nhưng tôi tự hỏi liệu có một cách thành ngữ trong clojure để giải quyết vấn đề này hay không.

Cảm ơn

Trả lời

6

Bạn có thể sử dụng promise bạn được hỏi về thời gian gần đây :) Một cái gì đó như thế này:

(def completion (promise)) 

; In test runner. 
; Wait 5 seconds then fail. 
(let [result (deref completion 5000 :fail)] 
    (if (= result :success) 
    (println "Great!") 
    (println "Failed :("))) 

; In jetty on callback 
(deliver completion :success) 
+0

Cảm ơn! Ban đầu tôi nghĩ về việc sử dụng những lời hứa nhưng tôi tập trung vào việc derefing bằng cách sử dụng @ và không biết rằng deref có thể mất thời gian chờ. – reshefm

3

Trong Clojure thẳng, sử dụng một đại lý theo dõi callbacks nổi bật sẽ có ý nghĩa, mặc dù trong thực tế tôi sẽ khuyên bạn nên sử dụng Aleph, đây là thư viện cho lập trình web không đồng bộ giúp cho việc xử lý dễ dàng hơn. Nó tạo ra các trình xử lý vòng, có vẻ như nó sẽ phù hợp với mã hiện có của bạn.

+1

Cảm ơn con trỏ. Trên thực tế lamina có vẻ như nó có thể chăm sóc tình trạng này. – reshefm

+1

Tôi đồng ý. Lamina có trọng lượng nhẹ hơn một chút cho những mục đích này. ps đó là https://github.com/ztellman/lamina cho người đọc trong tương lai. –

Các vấn đề liên quan