2008-08-07 34 views
12

Tôi có một quá trình trong erlang được cho là phải làm điều gì đó ngay lập tức sau khi sinh sản, sau đó gửi kết quả lại cho cha mẹ khi nó được hoàn thành. Làm thế nào để tôi tìm ra PID của quá trình sinh ra nó?Làm thế nào để bạn xác định PID của phụ huynh của một quá trình

+0

Đối với OTP và các quy trình khác bằng cách sử dụng 'proc_lib', hãy xem [Cách tìm người giám sát của quy trình OTP?] (Http://stackoverflow.com/questions/4132317/how-to-find-the-supervisor-of -an-otp-process) –

Trả lời

14

Bạn nên chuyển self() cho con làm một trong các đối số cho hàm nhập.

spawn_link(?MODULE, child, [self()]). 
0

Bạn có thể sử dụng BIF đăng ký để cung cấp cho sinh sản quá trình/mẹ một tên (một nguyên tử) sau đó xem lại tên đăng ký từ các quá trình khác.

FUNC() ->

%% Do something
%% Sau đó gửi thông điệp tới mẹ
mẹ! THÔNG ĐIỆP.

...

đăng ký (cha mẹ, tự()),
spawn (MODULE, FUNC, [ARGS]).

Xem Getting Started With Erlang §3.3The Erlang Reference Manual §10.3.

+0

Trong khi bạn có thể làm điều đó bằng cách đăng ký một tên, nó không phải là một ý tưởng tốt. Bài đăng này sẽ tốt hơn nếu bạn chủ động không khuyến khích làm việc đó và giải thích các vấn đề. – Christian

+1

Quay lại phiên bản beta riêng tư (câu hỏi này bắt đầu khoảng một tuần sau khi phiên bản beta riêng tư bắt đầu), khía cạnh thảo luận của trang web không được thiết lập tốt. Tôi không thực sự muốn đưa ra một ý kiến, chỉ đơn thuần là một cách tiếp cận khác. Tôi nghĩ rằng những ưu và nhược điểm đã được giải quyết đầy đủ trong các câu trả lời/bài viết khác. –

4

Câu trả lời @Eridius 'là cách ưu tiên để làm điều đó. Yêu cầu quy trình đăng ký tên có thể có các tác dụng phụ không mong muốn như tăng khả năng hiển thị của quy trình không đề cập đến những rắc rối khi đưa ra các tên duy nhất khi bạn có nhiều quy trình.

3

Cách tốt nhất chắc chắn là chuyển nó làm đối số cho hàm được gọi để bắt đầu quá trình con. Nếu bạn đang sinh sản vui vẻ, mà nói chung là một điều tốt để làm, hãy cẩn thận làm:

spawn_link(fun() -> child(self()) end) 

mà sẽ không làm như bạn dự định. (Gợi ý: khi nào là self() được gọi)

Nói chung bạn nên tránh đăng ký một quy trình, tức là đặt tên cho nó là toàn cầu, trừ khi bạn thực sự muốn nó được toàn cầu biết đến. Tạo ra một niềm vui có nghĩa là bạn không phải xuất các chức năng sinh ra như bạn thường nên tránh xuất khẩu các chức năng mà không có nghĩa là để được gọi từ các mô-đun khác.

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