2009-02-01 45 views
16

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ớ concurrencytin 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?

Trả lời

8

Tôi nghĩ bạn đã nhầm lẫn một chút với thuật ngữ. Các quy trình Erlang không nhất thiết phải tương ứng trực tiếp với các quy trình OS. Một quá trình hệ điều hành đã cho có thể có nhiều quy trình Erlang (và thường là), giống như quy trình của bạn có nhiều luồng. Nếu bạn muốn liên lạc giữa nhiều quá trình hệ điều hành, bạn có thể muốn xem System.Runtime.Remoting.Channels.Ipc. Conceivably một wrapper kiểu MailboxProcessor có thể được tạo ra xung quanh các API này.

8

Bộ xử lý hộp thư và AsyncReplyChannel không cung cấp độ trong suốt vị trí giống như thao tác "pid bang" (Pid!) Trong Erlang. Tất nhiên, điều này chỉ hoạt động khi các nút Erlang được phân phối được cấu hình đúng, tức là tên, DNS, mô-đun được đồng bộ hóa, cookie, v.v. Có một số tính năng trong OTP để làm cho quản trị này dễ dàng hơn. Tất nhiên, nếu các quy trình Erlang là trên cùng một nút, nó chỉ hoạt động. Nhưng, có một số nếp nhăn với phân phối Erlang.

"Mạng an toàn". Các cơ chế Erlang được phân phối tích hợp giả sử mạng là an toàn. Vì vậy, một phương pháp truyền thông dựa trên socket với các quy trình Erlang proxy được sử dụng khi bảo mật là cần thiết.

"Mạng đáng tin cậy". Một trong những điều làm cho công việc Erlang phân tán là triết lý xử lý lỗi của nó, cụ thể là các quá trình không đáng tin cậy và do đó khả năng chịu lỗi chỉ đạt được bằng cách giám sát quá trình giao tiếp. OTP mã hóa các mẫu (tức là Giám sát viên) để thực hiện triết lý này. Tin nhắn đáng tin cậy trong Erlang có thể đạt được thông qua Mnesia (một cơ sở dữ liệu phân tán), như đã được thực hiện trong RabbitMQ, nhưng bạn không nhận được nó ra khỏi hộp.

Cuối cùng, các liên lạc được phân phối không bao giờ dễ dàng như vậy. Chúng tôi có thể thực hiện một AsynchWorker trong F # để hoạt động như proxy của chúng tôi và giao tiếp với nó thông qua AsynchReplyChannel.Send. Chúng ta vẫn phải suy nghĩ về những nhược điểm của máy tính phân tán.

Cuối cùng, tính năng đồng thời kiểu thông báo không ngụ ý liên lạc ngoài quy trình. Nó ngụ ý rằng không có trạng thái chia sẻ để quản lý với khóa, do đó, một mô hình đơn giản hơn, ít bị lỗi hơn về tính toán song song. Tôi nghĩ rằng điều này Prime Number Sieve là một ví dụ tuyệt vời của phong cách này của concurrency. Ví dụ F # ​​không mang tính thẩm mỹ như Squeak hay Erlang, vì thiếu cú ​​pháp tích hợp để truyền thông điệp, nhưng nó hoạt động.

1

lẽ điều này sẽ làm

Map Reduce with F# agents

tôi đã không nhận được nhiều phản hồi vì vậy không chắc chắn nó đúng 100%. Nếu bạn nghĩ rằng xấu của nó xin vui lòng letme biết.

Cảm ơn!

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