2010-02-16 23 views
10

xem xét mã Erlang sau:Làm thế nào để làm cho các thông điệp trì hoãn TChan của Haskell như hàng đợi thông điệp của Erlang có thể?

-module(testit). 
-export([testit/0]). 

testit() -> 
    Pid = spawn(fun testit_proc/0), 
    Pid ! final, 
    Pid ! one, 
    Pid ! two, 
    io:format("Root finished~n"). 

testit_proc() -> 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n") 
    end, 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n") 
    end, 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n"); 
     final -> io:format("Final~n") 
    end, 
    io:format("Spawn finished~n"). 

Đầu ra là:

Root finished 
One 
Two 
Final 
Spawn finished 

Việc xử lý của thông điệp final được về cơ bản hoãn lại cho đến người cuối cùng nhận được khối nhờ các nhận mô hình trước đó không phù hợp mà thông điệp.

Bạn làm điều này với TChan của Haskell như thế nào?

Trả lời

3

Bạn đang đề cập đến tính năng nhận chọn lọc của Erlang. Theo như tôi biết, STM trong Haskell không có song song với nó. Các lựa chọn của bạn là để cấu trúc lại mã của bạn để loại bỏ nhu cầu (chẳng hạn như sử dụng các hàng đợi riêng biệt cho các loại thông tin khác nhau có thể nhận được), hoặc để thực hiện tính năng này trong thư viện.

Ngữ nghĩa của nhận chọn lọc là ngoài hàng đợi tin nhắn đến, bạn cũng có danh sách thư bị trì hoãn. Trong chức năng nhận, trước tiên bạn cần phải quét danh sách hoãn lại cho bất kỳ tin nhắn phù hợp nào. Nếu một tin nhắn phù hợp, sau đó bạn xóa nó khỏi danh sách và phân phối nó. Nếu không có thư bị trì hoãn nào phù hợp thì bạn cần phải đợi thư trên hộp thư đến. Khi nhận được tin nhắn, bạn kiểm tra xem nó có khớp không. Nếu có, thì bạn giao nó; nếu không, sau đó bạn đẩy nó vào danh sách hoãn lại và lặp lại.

+2

Đồng ý. Các ngữ nghĩa này không tồn tại trong các gói 'Chan' hay' TChan' cơ bản - bạn sẽ phải tự mình thực hiện một hàng đợi trì hoãn. –

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