Tôi có một nhóm các công việc xử lý tương lai từ một hàng đợi liên quan đến việc ghi vào các tệp. Cách thành ngữ để đảm bảo chỉ một tương lai truy cập vào một tệp cụ thể tại một thời điểm là gì?khóa tập tin thành ngữ trong clojure?
Trả lời
Cách sử dụng tác nhân thay vì khóa để đảm bảo điều này?
Tôi nghĩ rằng việc sử dụng tác nhân để bảo vệ an toàn được chia sẻ trạng thái có thể thay đổi, bất kể nó có trong bộ nhớ hoặc trên đĩa có nhiều thành ngữ trong clojure hơn là sử dụng khóa hay không.
Nếu bạn tạo một tác nhân tại một thời điểm và gửi quyền truy cập vào đại lý, bạn có thể đảm bảo rằng chỉ trên chuỗi tại thời điểm truy cập tệp đã cho.
Ví dụ như thế này:
(use 'clojure.contrib.duck-streams)
(defn file-agent [file-name]
(add-watch (agent nil) :file-writer
(fn [key agent old new]
(append-spit file-name new))))
(defn async-append [file-agent content]
(send file-agent (constantly content)))
sau đó nối tập tin của bạn thông qua các đại lý:
(async-append "content written to file" (file-agent "temp-file-name"))
Nếu bạn cần sử dụng đồng bộ các tập tin nó có thể đạt được với chờ đợi. Như thế này:
(defn sync-append [file-agent content]
(await (send file-agent (constantly content))))
Tôi không nghĩ rằng có chức năng tích hợp cụ thể cho điều này trong Clojure nhưng bạn có thể sử dụng các hàm IO java tiêu chuẩn để thực hiện việc này. Điều này sẽ trông giống như sau:
(import '(java.io File RandomAccessFile))
(def f (File. "/tmp/lock.file"))
(def channel (.getChannel (RandomAccessFile. f "rw")))
(def lock (.lock channel))
(.release lock)
(.close channel)
Tôi đã kiểm tra đại lộ này trước, nhưng tiếc là phương pháp này chỉ hữu ích để khóa tệp khỏi quyền truy cập của các quy trình khác. Khi làm việc với nhiều luồng trong cùng một máy ảo, khóa và tryLock cả hai sẽ ném một ngoại lệ nếu một luồng khác trong cùng một máy ảo đã có tệp bị khóa, thay vì chặn cho đến khi tệp có sẵn. – jhickner
Tôi sẽ sử dụng lõi Clojure chức năng locking được sử dụng như sau:
(locking some-object
(do-whatever-you-like))
Đây some-object
hoặc có thể là các tập tin riêng của mình, hoặc cách khác bất kỳ đối tượng tùy ý mà bạn muốn đồng bộ hóa trên (có thể có ý nghĩa nếu bạn muốn có một khóa duy nhất để bảo vệ nhiều tệp).
Phía dưới nắp này sử dụng khóa đối tượng JVM tiêu chuẩn, do đó về cơ bản nó tương đương với một khối mã được đồng bộ trong Java.
- 1. Ghi vào một tập tin trong Clojure
- 2. Python tập tin iterator qua một tập tin nhị phân với thành ngữ mới hơn
- 3. Chức năng Chế độ thành ngữ trong Clojure
- 4. Cách thành ngữ để recurse thông qua các bộ sưu tập trong Clojure
- 5. Cách thành ngữ để lặp qua tất cả các cặp của bộ sưu tập trong Clojure
- 6. File.Copy khóa tập tin mã nguồn sau khi hoàn thành
- 7. BitmapImage trong WPF làm tập tin khóa
- 8. luận Clojure từ khóa
- 9. Làm thế nào để biên dịch tập tin trong clojure
- 10. Clojure thành ngữ để báo cáo tiến độ?
- 11. Clojure thành ngữ để đồng bộ giữa các chủ đề
- 12. Đây có phải là Clojure thành ngữ không?
- 13. Câu hỏi về clojure thành ngữ khi chuyển đổi chuỗi
- 14. Sử dụng Clojure DataFlow thành ngữ lập trình
- 15. FileReference: Tải tập tin bị khóa Windows
- 16. Cách thành ngữ nhất để truyền vectơ cho var-args trong clojure là gì?
- 17. Cách thành ngữ để xây dựng cấu trúc tùy chỉnh từ dây kéo XML trong Clojure
- 18. Đăng nhập một tập tin bằng khóa riêng trong .NET
- 19. Thực hiện một tập tin di động khóa cơ chế
- 20. Cách tiếp cận thành ngữ để cấu trúc mã nguồn Clojure
- 21. Tải phần mở rộng tập tin bằng ngôn ngữ C
- 22. cách thành ngữ để thay thế (null x) chức năng từ lisp phổ biến trong clojure
- 23. Cách Clojure thành ngữ để tìm các mục thường xuyên nhất trong seq
- 24. clojure: cách thành ngữ của việc loại bỏ trùng lặp trong một "if"?
- 25. Thành ngữ (defn -main ...) có nghĩa là gì trong chương trình clojure?
- 26. Cách thành ngữ để lấy yếu tố đầu tiên của một seq lười biếng trong clojure
- 27. C# XML.load() khóa tập tin trên đĩa lỗi gây
- 28. Clojure: Cách thành ngữ để chèn một Char vào một chuỗi
- 29. Tiện ích tập tin trong php?
- 30. Chuyển tập tin llvm .bc thành tập tin .ll có thể đọc được của con người
Gọn gàng! Phải mất một chút để có được đầu của tôi xung quanh này. Tôi đã kết thúc bằng cách sử dụng một ref cho một bản đồ có chứa một mục nhập cho mỗi tập tin mở. Giải pháp của bạn trông giống như nó có thể đẹp hơn nhiều. – jhickner
Tôi vẫn chưa rõ về điều gì đó - nếu hai chủ đề cả hai đều gọi async-append và truyền vào cùng tên tệp, thì điều gì sẽ khiến cả hai mở tệp? Dường như cuộc gọi đến tác nhân tệp trong async-append sẽ tạo một tác nhân duy nhất cho mỗi chuỗi, phải không? – jhickner
Xin lỗi vì các hướng dẫn không rõ ràng, tôi muốn tạo một tác nhân tệp cho mỗi tệp và sau đó nối thêm thông qua tính năng thêm đồng bộ hóa hoặc nối thêm tùy thuộc vào bất kỳ khi nào bạn cần thêm đồng bộ hoặc đồng bộ. Bạn có thể giữ cho các đại lý họ có thể trong bản đồ để tìm đại lý chính xác. –