2011-12-07 40 views
8

Tôi có một ứng dụng đa luồng được viết bằng Clojure. Có một vấn đề làm cho một văn bản trong giao diện điều khiển hiển thị chính xác khi nhiều chủ đề ghi vào STDOUT. Làm thế nào tôi có thể làm điều này một cách chính xác trong Clojure, do đó, các dòng sẽ không nhìn interlaced? Tôi nghĩ rằng điều này sẽ liên quan đến một số loại đại lý IO riêng biệt, nhưng tôi không thực sự chắc chắn làm thế nào để làm điều đó.Đồng bộ hóa đầu ra tiêu chuẩn trong Clojure

Trả lời

9

Tôi nghĩ rằng đây sẽ bao gồm một số loại riêng biệt IO đại lý

Vâng, đó là nên làm việc. Tạo một đại lý (def printer (agent nil)) và gọi nó bằng tuyên bố print thích hợp, ví dụ: (send printer #(println msg)). Các thông điệp được đặt trong một hàng đợi và được thực hiện (không đồng bộ) một tại một thời điểm.

Vì mục đích ghi nhật ký, bạn cũng có thể xem tools.logging sử dụng tác nhân dưới mui xe.

+0

Tác phẩm này hoạt động, ngoại trừ tôi phải gửi cho tác nhân tác vụ in thông qua một proxy chức năng khác. Việc gửi bản in trực tiếp tới đại lý sẽ không hoạt động vì một số lý do. – bvk256

+0

Trong [bài viết này] (http://clojure.org/agents) trên trang web của Clojure, nó có nội dung: "Các tác vụ được gửi đến đại lý từ một ** tác nhân đơn lẻ khác ** sẽ xảy ra theo thứ tự đã gửi, ** có khả năng xen kẽ ** với các hành động được gửi đến cùng một tác nhân ** từ các nguồn khác **. " Điều này có nghĩa là vẫn có thể có vấn đề khi "** nhiều chủ đề ** ghi vào STDOUT"? –

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