Điều gì xảy ra khi bạn tạo các cuộc gọi dosync lồng nhau? Các giao dịch phụ sẽ được hoàn thành trong phạm vi cha mẹ? Các giao dịch phụ này có thể đảo ngược nếu giao dịch gốc không thành công không?Cuộc gọi dosync lồng nhau hoạt động như thế nào?
Trả lời
Nếu bạn có nghĩa là làm tổ cú pháp, thì câu trả lời là nó phụ thuộc vào việc bên trong dosync
sẽ chạy trên cùng một luồng như bên ngoài.
Trong Clojure, bất kỳ khi nào một khối dosync
được nhập, giao dịch mới sẽ được bắt đầu nếu chưa chạy trên chủ đề này. Điều này có nghĩa rằng trong khi thực thi vẫn nằm trên một luồng đơn, các giao dịch bên trong có thể được cho là được các giao dịch bên ngoài phủ nhận; tuy nhiên nếu một số dosync
chiếm một vị trí được lồng trong một cú pháp khác trong số dosync
, nhưng sẽ xảy ra khi được khởi chạy trên một chuỗi mới, nó sẽ có một giao dịch mới cho chính nó.
Một ví dụ đó (hy vọng) minh họa những gì sẽ xảy ra:
user> (def r (ref 0))
#'user/r
user> (dosync (future (dosync (Thread/sleep 50) (println :foo) (alter r inc)))
(println :bar)
(alter r inc))
:bar
:foo
:foo
1
user> @r
2
Các giao dịch "bên trong" thử lại sau in :foo
; giao dịch "bên ngoài" không bao giờ cần phải khởi động lại. (Lưu ý rằng sau khi điều này xảy ra, chuỗi lịch sử của r
được phát triển, vì vậy nếu biểu mẫu "lớn" dosync
được đánh giá lần thứ hai, thì bên trong dosync
sẽ không thử lại. Tất nhiên.)
Ngẫu nhiên, Mark Volkmann đã viết một bài báo tuyệt vời về Clojure's Software Transactional Memory; nó rất khuyến khích đọc cho bất cứ ai quan tâm đến việc đạt được cái nhìn sâu sắc vững chắc vào chi tiết của loại này.
- 1. RequireJS: lồng nhau yêu cầu cuộc gọi
- 2. Có cách nào để lồng các cuộc gọi đến F # mẫu đang hoạt động không?
- 3. flexbox CSS3 lồng nhau không hoạt động
- 4. CAST lồng nhau không hoạt động
- 5. Hàng đợi.js hoạt động như thế nào?
- 6. Cách tạo truy vấn lồng nhau trong MongoDb hoạt động như truy vấn chọn Sql lồng nhau
- 7. 'Gọi' hoạt động như thế nào trong javascript?
- 8. Android - Quay lại cuộc gọi Hoạt động
- 9. F # inline hoạt động như thế nào?
- 10. RedirectToRouteResult hoạt động như thế nào?
- 11. CTFE hoạt động như thế nào?
- 12. Thao tác commit_on_success được lồng nhau như thế nào?
- 13. OpenMP xử lý các vòng lồng nhau như thế nào?
- 14. Function.prototype.call.bind hoạt động như thế nào?
- 15. Sched_setaffinity() hoạt động như thế nào?
- 16. WPF INotifyPropertyChanged hoạt động như thế nào?
- 17. delegate.Invoke hoạt động như thế nào?
- 18. Boost.Python hoạt động như thế nào?
- 19. 'typeof' hoạt động như thế nào?
- 20. Cổng API hoạt động như thế nào?
- 21. RunDll32 hoạt động như thế nào?
- 22. Cách Queryable.OfType hoạt động như thế nào?
- 23. Nén MPEG4 hoạt động như thế nào?
- 24. gdb hoạt động như thế nào?
- 25. Danh mục hoạt động như thế nào?
- 26. Trình bundler hoạt động như thế nào?
- 27. Wolfram Alpha hoạt động như thế nào?
- 28. Form.reset() hoạt động như thế nào?
- 29. NSMutableData hoạt động như thế nào?
- 30. D3.scale.quantile hoạt động như thế nào?
Tôi thích ví dụ này. –
Tại sao bộ định tính "cú pháp"? Và cú pháp có ý nghĩa gì? Tôi là một lisper phổ biến và tôi quen với "lexically", như trong kết thúc các biến được lexically nhìn thấy: (let ((x 42)) (lambda() x)) vs động (tức là, bị ràng buộc trong ngăn xếp cuộc gọi một nơi nào đó). – kennytilton