2014-11-19 17 views
11

Tôi không hoàn toàn chắc chắn sự khác biệt giữa PID và Tham chiếu và thời điểm sử dụng.Tham chiếu vs pid?

Nếu tôi tạo ra một quy trình mới với spawn/1 pid. Tôi có thể giết nó bằng PID không? Tại sao tôi cần một tài liệu tham khảo?

Tương tự như vậy, tôi thấy monitor/1 nhận được thư có số ref và pid.

Cảm ơn!

Trả lời

23

Pid là số nhận dạng quy trình. Bạn có thể nhận được một khi bạn tạo quy trình mới với spawn hoặc bạn có thể nhận được Pid của chính mình bằng self(). Nó cho phép bạn tương tác với quá trình đã cho. Đặc biệt gửi tin nhắn cho nó bằng Pid ! Message. Và một số thứ khác, như giết nó một cách rõ ràng (không nên làm) hoặc thu thập một số thông tin quy trình với erlang:process_info.

Và bạn có thể tạo mối quan hệ giữa quá trình với erlang:link(Pid)erlang:monitor(process, Pid) (đó là giữa quá trình Pid và quá trình thực hiện chức năng này). Trong ngắn hạn, nó mang lại cho bạn "thông báo" khi một quá trình khác chết.

Tham khảo chỉ là almost unique giá trị (thuộc loại khác). Người ta có thể nói, rằng nó cung cấp cho bạn một số tham chiếu đến đây và bây giờ, mà bạn có thể nhận ra sau này.Ví dụ, nếu chúng ta gửi một thông điệp đến một tiến trình khác, và chúng ta mong đợi một phản hồi, chúng ta muốn đảm bảo rằng thông điệp chúng ta sẽ nhận được liên quan đến yêu cầu của chúng ta chứ không phải bất kỳ tin nhắn nào từ người khác. Cách dễ nhất để thực hiện việc này là gắn thẻ tin nhắn với một giá trị duy nhất và đợi cho đến khi một phản hồi với chính xác cùng một thẻ.

Tag = make_ref(), 
    Pid ! {Tag, Message}, 
    receive 
    {Tag, Response} -> 
     .... 

Trong mã này, với việc sử dụng phù hợp với mô hình, chúng tôi đảm bảo rằng (chúng tôi chờ đợi trong nhận cho đến khi) Response là chính xác cho Message chúng tôi đã gửi. Không có vấn đề thông điệp khác từ các quá trình khác. Đây là cách sử dụng tài liệu tham khảo phổ biến nhất mà bạn có thể gặp phải.

Và bây giờ, hãy quay lại monitor. Khi gọi Ref = monitor(process, Pid), chúng tôi sẽ thực hiện kết nối đặc biệt này với quy trình Pid. Ref được trả lại chỉ là một số tham chiếu duy nhất mà chúng tôi có thể sử dụng để demonitor quy trình này. Đó là tất cả.

Người ta chỉ có thể hỏi, nếu chúng ta có thể tạo màn hình với Pid, tại sao chúng ta cần Ref để tìm kiếm? Chúng ta không thể chỉ sử dụng lại Pid. Về lý thuyết, chúng tôi có thể, nhưng các màn hình được thực hiện theo cách như vậy, nhiều màn hình có thể được thiết lập giữa hai quy trình tương tự. Vì vậy, khi phản đối, chúng ta phải loại bỏ chỉ một trong những kết nối như vậy. Nó được thực hiện theo cách này để làm cho việc giám sát minh bạch hơn. Nếu bạn có thư viện chức năng tạo và xóa một màn hình, bạn sẽ không muốn can thiệp vào các thư viện và chức năng và màn hình khác mà chúng có thể đang sử dụng.

3

Theo this page:

Tài liệu tham khảo là những đối tượng erlang với chính xác hai thuộc tính:

They can be created by a program (using make_ref/0), and, 
They can be compared for equality. 

Bạn nên sử dụng nó bao giờ bạn cần để ràng buộc một định danh duy nhất cho một số "đối tượng". Bất cứ lúc nào bạn có thể tạo một cái mới bằng cách sử dụng erlang:make_ref/0. Documentation nói:

make_ref() -> Tham chiếu()

Trả về một tài liệu tham khảo gần như duy nhất.

Tham chiếu được trả lại sẽ xảy ra sau khoảng 2^82 cuộc gọi; do đó nó là duy nhất đủ cho các mục đích thực tế.

Khi bạn gọi hàm erlang:monitor/2, hàm này sẽ trả về tham chiếu cho bạn khả năng hủy màn hình (erlang:demonitor/1 chức năng). Tham chiếu này chỉ xác định cuộc gọi nhất định là erlang:monitor/1. Nếu bạn cần thao tác với quy trình (ví dụ như giết nó), bạn vẫn phải sử dụng tiến trình pid.

Tương tự như vậy tôi thấy màn hình/1 nhận thông báo có số ref và pid.

Đúng, màn hình gửi các thông báo như {'DOWN', Ref, process, Pid, ​​Reason}. Những gì để sử dụng (pid hoặc ref) chỉ phụ thuộc vào logic ứng dụng của bạn, nhưng (IMO) trong hầu hết các trường hợp thông thường, không có vấn đề gì để sử dụng.

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