Tôi có một quy trình cần thực hiện một số công việc sau mỗi mười lăm giây. Tôi hiện đang làm việc đó như thế này:Cách tốt nhất để làm điều gì đó định kỳ trong Erlang?
-behavior(gen_server). interval_milliseconds()-> 15000. init()-> {ok, _State = FascinatingStateData, _TimeoutInterval = interval_milliseconds() }. %% This gets called automatically as a result of our handlers %% including the optional _TimeoutInterval value in the returned %% Result handle_info(timeout, StateData)-> {noreply, _State = do_some_work(StateData), _TimeoutInterval = interval_milliseconds() }.
này hoạt động, nhưng nó rất giòn: nếu tôi muốn dạy máy chủ của tôi một tin nhắn mới, khi tôi viết bất kỳ chức năng xử lý mới, tôi phải nhớ để bao gồm các khoảng thời gian chờ tùy chọn trong giá trị trả về của nó. Nghĩa là, nói nếu tôi xử lý một cuộc gọi đồng bộ, tôi cần phải làm điều này:
%% Someone wants to know our state; tell them handle_call(query_state_data, _From, StateData)-> {reply, StateData, _NewStateData = whatever(), interval_milliseconds()};
thay vì
%% Someone wants to know our state; tell them handle_call(query_state_data, _From, StateData)-> {reply, StateData, _NewStateData = whatever()};
Như bạn có thể đoán, tôi đã thực hiện điều đó rất nhầm lẫn một số lần. Thật khó chịu, bởi vì một khi mã xử lý thông điệp query_state_data đó, thời gian chờ không còn được tạo ra nữa, và toàn bộ máy chủ bị ngừng lại. (Tôi có thể "khử rung" bằng tay bằng cách lấy một vỏ trên máy và gửi một thông báo "hết giờ" bằng tay, nhưng ... eww.)
Bây giờ, tôi có thể cố nhớ luôn chỉ định tham số Timeout tùy chọn trong giá trị kết quả của tôi. Nhưng điều đó không quy mô: Tôi sẽ quên một ngày nào đó, và sẽ nhìn chằm chằm vào lỗi này một lần nữa. Vì vậy: một cách tốt hơn là gì?
Tôi không nghĩ rằng tôi muốn viết một vòng lặp thực sự chạy mãi mãi, và dành phần lớn thời gian của mình ngủ; dường như phản đối tinh thần của OTP.
Đã một vài năm kể từ khi tôi chạm vào Erlang, nhưng điều này trông giống như những gì tôi đã làm. Cảm ơn. – offby1