2010-02-24 21 views
5

Thông thường nếu tôi muốn có một quá trình thời gian chờ Erlang Tôi sẽ sử dụng các cấu trúc sau:Cho phép một gen_fsm để timeout nếu nó không nhận được thông điệp

receive 
    Msg -> ok; %% handle message 
after 60000 -> 
    %% Handle timeout and exit 
end. 

Có một cơ chế tương tự trong các máy chủ OTP như gen_fsm? Tôi sẽ sinh ra gen_fsm's cho mỗi phiên hoạt động với ứng dụng của tôi và muốn họ thoát ra nếu giá trị thời gian chờ không hoạt động bị vượt quá sau khi nhận được tin nhắn.

Tôi có thể viết quy trình tùy chỉnh của riêng mình nếu cần, nhưng muốn sử dụng gen_fsm nếu có thể.

Trả lời

11

Tôi tìm hiểu thêm và tìm câu trả lời cho câu hỏi của riêng tôi.

Có một đối số thứ tư tùy chọn trong trình xử lý tin nhắn "Kết quả" mà bạn có thể sử dụng là thời gian chờ.

vậy:

some_fsm_state({set, Val}, State) -> 
    NewState = do(Val, State), 
    {next_state, another_fsm_state, NewState, 5000}; 

another_fsm_state(timeout, State) -> 
    handle_timeout(State). 

another_fsm_state({set, Val}, State) -> 
    %% more code that handles this state. 

Khi some_fsm_state được gọi, nó chuyển sang trạng thái tiếp theo của "another_fsm_state" với một thời gian chờ của 5000ms. Nếu không nhận được tin nhắn mới trong vòng 5000ms, thì another_fsm_state (timeout, State) được gọi.

Lập trình viên OTP thông minh. :)

Cần lưu ý rằng yếu tố thứ tư này trong bộ kết quả có thể được ngủ đông. Vui lòng xem tài liệu Erlang để biết thêm thông tin.

Erlang - Hibernate

gen_fsm docs

+3

Ngoài ra bạn có thể đặt thời gian chờ ban đầu, nếu bạn vượt qua một '{timeout, Time} 'tùy chọn khi gọi bắt đầu. – Zed

+0

Tuyệt vời, cảm ơn bạn Zed! –

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