Nó không đạt được phát hành chính thức, nhưng core.async
vẻ như nó có thể là một cách thú vị giải quyết vấn đề của bạn - và vấn đề đồng bộ khác, rất gọn gàng.
Các bùa leiningen cho core.async
là (hiện tại) như sau:
[org.clojure/core.async "0.1.0-SNAPSHOT"]
Và đây là một số mã để thực hiện một chức năng đó sẽ mất một số chức năng tốn nhiều thời gian, và ngăn chặn cho đến khi một trong số họ trở về.
(require '[clojure.core.async :refer [>!! chan alts!! thread]]))
(defn return-first [& ops]
(let [v (map vector ops (repeatedly chan))]
(doseq [[op c] v]
(thread (>!! c (op))))
(let [[value channel] (alts!! (map second v))]
value)))
;; Make sure the function returns what we expect with a simple Thread/sleep
(assert (= (return-first (fn [] (Thread/sleep 3000) 3000)
(fn [] (Thread/sleep 2000) 2000)
(fn [] (Thread/sleep 5000) 5000))
2000))
Trong ví dụ trên:
chan
tạo ra một kênh không đồng bộ
>!!
đặt một giá trị vào một kênh
thread
thực hiện cơ thể trong một thread
alts!!
mất một vector kênh và trả về khi giá trị xuất hiện trên bất kỳ kênh nào trong số đó
Có cách hơn để nó hơn này, và tôi vẫn nhận được vòng đầu của tôi nó, nhưng có một hương ở đây: https://github.com/clojure/core.async/blob/master/examples/walkthrough.clj
Và blog của David Nolen của có một số rất lớn, nếu tâm-boggling, bài viết trên nó (http://swannodette.github.io/)
Sửa
Chỉ cần thấy rằng Michał Marczyk đã trả lời một câu hỏi rất giống nhau, nhưng tốt hơn, ở đây, và nó cho phép bạn hủy bỏ/ngắn mạch. with Clojure threading long running processes and comparing their returns
Nguồn
2013-08-19 15:20:19
Cảm ơn bạn soulcheck (và tất cả những người khác đã đóng góp). Tôi đang dần dần tiến tới cùng một giải pháp như trên, nhưng mã của tôi không ngắn gọn hay thanh lịch; Tôi mới học ngôn ngữ và cần một số thực hành;) –