tôi nhận thấy những nhận xét sau đây trong bản sao của tôi của Expert F # trên trang 379:Mailbox Processor trên Hệ thống phân phối
Passing và Tin nhắn Processing
Một khác biệt thường được thực hiện giữa chia sẻ bộ nhớ concurrency và tin nhắn chuyển tiền đồng thời. Trước đây là thường hiệu quả hơn trên các máy địa phương và được đề cập trong phần "Sử dụng Đồng bộ hóa chia sẻ bộ nhớ" sau trong chương này. Sau đó, quy mô là các hệ thống không có bộ nhớ nào được chia sẻ , được phân phối và cũng có thể được sử dụng để tránh các sự cố về hiệu suất được liên kết với bộ nhớ dùng chung.
Tôi quan tâm đến thông điệp đồng thời giữa các quá trình không có bộ nhớ dùng chung. Tất cả các ví dụ trong Expert F # và trên mạng Internet mà chứng minh làm thế nào để sử dụng MailboxProcessor chứa một số biến thể của mã này:
let counter =
MailboxProcessor.Start(fun inbox ->
let rec loop n =
async {
do printfn "n = %d, waiting... " n
let! msg = inbox.Receive()
match msg with
| -1 ->
do printfn "'Til the bitter end..."
return()
| n -> return! loop(n + msg)
}
loop 0)
counter.Post(20)
counter.Post(50)
counter.Post(-1) // kill mailbox
Nói cách khác, bạn cần phải có một tay cầm trên MailboxProcessor của bạn trong chia sẻ bộ nhớ trước bạn có thể đăng tin nhắn lên kênh của nó. Đây không phải là Erlang-concurrency phong cách như xa như tôi biết nó, vì bạn chỉ có thể gửi tin nhắn cho MailboxProcessors trong quá trình tương tự (lưu ý: quá trình, không thread).
Có thể một Nhà cung cấp hộp thư trong một quy trình gửi thư đến một quy trình MailboxProcessor khác không? Nếu có, bạn có thể cung cấp mẫu không?