2011-07-16 22 views
15

Sau khi xem màn hình Pragmatic Studio xuất hiện trên Erlang, video cuối cùng trên Giám sát đã đề cập rằng để người giám sát nhận được thông báo về một trong các con của nó để nó có thể khởi động lại đúng cách, trẻ em nên đăng ký với process_flag(trap_exit, true). Có lẽ tôi chỉ hiểu lầm tác giả (và rất có thể là RẤT cao mà tôi đã hiểu sai), nhưng tôi nghĩ những người giám sát tự động biết khi nào con cái của họ chết (có thể thông qua spawn_link hoặc một cái gì đó tương tự trong nền). Điều này có thực sự cần thiết không? Khi ta nên sử dụng process_flag (trap_exit, true) trong một trường hợp thế giới thực vì các tài liệu một cách rõ ràng tình trạng sau đây:Erlang và process_flag (trap_exit, true)

http://www.erlang.org/doc/man/erlang.html#process_flag-2

process_flag (trap_exit, Boolean)

Khi trap_exit được thiết lập đúng, các tín hiệu thoát đến một quy trình được chuyển thành các tin nhắn {'EXIT', From, Reason}, có thể nhận được dưới dạng tin nhắn thông thường. Nếu trap_exit được đặt thành false, quá trình sẽ thoát nếu nó nhận được tín hiệu thoát khác với tín hiệu thoát và tín hiệu thoát được truyền đến các quy trình được liên kết của nó. quá trình ứng dụng nên thường không bẫy exits.``

+0

Sự cần thiết thiết lập cờ trap_exit trong ứng dụng OTP thực sự là một tình huống đặc biệt. Hầu hết các ứng dụng OTP không cần thiết lập cờ trap_exit một cách rõ ràng khi người giám sát được thiết kế để xử lý chúng một cách chính xác theo thông số kỹ thuật của trẻ. –

Trả lời

24

Bạn có 3 thành ngữ:

1/Tôi không quan tâm nếu quá trình con tôi chết:

spawn(...) 

2/I muốn sụp đổ nếu con tôi xử lý sự cố:

spawn_link(...) 

3/Tôi muốn nhận thư nếu c của tôi Hild quá trình chấm dứt (thường hay không):

process_flag(trap_exit, true), 
spawn_link(...) 

Hãy xem ví dụ này và thử các giá trị khác nhau (nghịch đảo với 2 hoặc 0 để khiêu khích một ngoại lệ, và sử dụng trap_exit hay không):

-module(play). 
-compile(export_all). 

start() -> 
    process_flag(trap_exit, true), 
    spawn_link(?MODULE, inverse, [2]), 
    loop(). 

loop() -> 
    receive 
     Msg -> io:format("~p~n", [Msg]) 
    end, 
    loop(). 

inverse(N) -> 1/N. 
+0

Re # 1 - Tôi thường nghĩ rằng, nhưng sau đó tôi nhận ra tôi muốn quá trình đó để thoát ra khi hệ thống của tôi tắt. Đó là những gì trẻ em được giám sát tạm thời. – Dustin

+0

Tôi không nghĩ rằng điều này thực sự trả lời câu hỏi ... –

+0

Tôi cũng nghĩ vậy. Tôi nghĩ @rvirding đã đưa ra câu trả lời đúng cho câu hỏi –

27

giám sát sử dụng các liên kết và lối thoát bẫy để họ có thể theo dõi con cái của họ và khởi động lại chúng khi cần thiết. Các quy trình con làm không phải bẫy các lối thoát để được quản lý đúng cách bởi người giám sát của chúng, thực ra chúng chỉ nên bẫy khi chúng cần biết rằng một số quá trình mà chúng liên kết chết và chúng không muốn tự sụp đổ.

Các hành vi OTP có thể xử lý giám sát đúng cách nếu chúng bị kẹt hoặc không bị mắc kẹt.

14

Trong Erlang, các quy trình có thể là được liên kết với nhau. Các liên kết này là hai chiều. Bất cứ khi nào một quá trình chết, nó sẽ gửi tín hiệu thoát tới tất cả các quy trình được liên kết. Mỗi quy trình này sẽ có cờ đánh dấu bị tạm dừng được bật hoặc tắt. Nếu cờ bị tắt (mặc định), quá trình được liên kết sẽ bị lỗi ngay khi nhận được tín hiệu thoát. Nếu cờ đã được kích hoạt bằng một cuộc gọi đến system_flag(trap_exit, true), quá trình sẽ chuyển đổi tín hiệu thoát đã nhận thành thông báo xuất cảnh và nó sẽ không bị lỗi. Thông báo thoát sẽ được xếp hàng đợi trong hộp thư của nó và được coi là thông báo bình thường.

Nếu bạn đang sử dụng người giám sát OTP, họ sẽ chăm sóc cờ và chi tiết trap_exit cho bạn, vì vậy bạn không cần phải quan tâm đến nó.

Nếu bạn đang triển khai cơ chế giám sát, đó có thể là nội dung mà màn hình sắp diễn ra (chưa thấy), bạn sẽ phải lo về điều trap_exit.

+0

câu trả lời tuyệt vời. –

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