2011-12-12 12 views
5

Tôi muốn tạo hộp thư TChan theo cách thủ công cho các chủ đề trong đó thư/gói mạng đi vào được thu thập trong cùng một hàng đợi dưới dạng thư từ chuỗi địa phương.Làm cách nào để đính kèm hộp thư TChan vào luồng và nhận/gửi thư bằng cách sử dụng ổ cắm?

Tôi không chắc chắn về cách tiếp cận Haskell điển hình sẽ có ở đây. Làm cách nào tôi có thể viết từ ví dụ: một ổ cắm vào một hộp thư TChan?

Sau đó, nó sẽ là một Hộp thư với một số hàng đợi riêng biệt? Hoặc thực hiện một số hộp thư?

Tôi đã xem xét epass nhưng chưa được thử. Tôi nghĩ rằng những gì tôi muốn làm là có thể tôi đã không thực sự là một ý tưởng chi tiết để tôi bắt đầu. Có ai có một ví dụ mã của một cái gì đó tương tự?

Trả lời

4

Tôi nghi ngờ bạn có thể đang suy nghĩ về điều này một chút. TChan là một trừu tượng khá đơn giản và chỉ đơn thuần là cấu trúc dữ liệu trơ. Nếu bạn muốn sử dụng một, chỉ cần có chủ đề đọc/ghi bằng cách sử dụng nó như là thích hợp.

Vì vậy, để kết nối ổ cắm, bạn có thể chỉ cần tạo mã thăm dò ổ cắm và ghi bất kỳ thứ gì vào đó TChan. Đặt nó trong một vòng lặp vô hạn sau đó gió nó lên và để cho nó bay. Các chủ đề của Haskell khá nhẹ và bất biến có nghĩa là nhức đầu đồng thời hầu như không tồn tại, vì vậy ngoài việc cẩn thận không sử dụng các cuộc gọi chặn FFI (điều này có thể là mối quan tâm với ổ cắm, vì vậy hãy đọc tài liệu). khi họ có ý nghĩa.

Nếu bạn thực sự muốn điều gì đó huyền ảo hơn và tìm một thư viện có thể hoạt động, có lẽ epass, thì điều bạn thực sự muốn là mã mẫu cho thư viện cụ thể đó.

Ồ, và cho những gì nó có giá trị - việc thực hiện TChan về bản chất là một danh sách liên kết được làm bằng TVar s với hai tham chiếu vào nó, không có gì hơn. Đọc di chuyển con trỏ đầu về phía trước, để lại các ô trước đó một mình cho các bản sao của TChan hoặc bộ thu gom rác để tìm và viết sẽ tạo một ô mới ở con trỏ đuôi. Tất cả điều đó được thực hiện trong các giao dịch STM, tất nhiên.

+0

Cảm ơn. Có lẽ một sự cải cách những gì tôi đang tìm kiếm: Tôi muốn gửi từ các thông điệp/dữ liệu bên ngoài đến một hoặc nhiều quy trình (không phải là một ứng dụng) ở bên trong. Tôi tưởng tượng nó trong hành động rất khó nhận, xếp hàng và d-xếp các thông báo như vậy và đưa chúng vào đúng quy trình trừ khi mọi quá trình chấp nhận trên một cổng tcp/udp khác mà tôi cho là không thanh lịch. –

+0

@JFritsch: Nếu bạn có nhiều quy trình, thì đó là một vấn đề khác, phải không? 'TChan' là cho các luồng trong một tiến trình đơn lẻ. Bạn chắc chắn có thể có một luồng chấp nhận các thông điệp trên một socket duy nhất và định tuyến chúng tới 'TChan's cho các luồng khác, tuy nhiên. Đây là tất cả các công cụ rất linh hoạt, vì vậy bạn có thể thực hiện bất kỳ cấu trúc truyền thông nào bạn muốn. –

+0

Có chức năng nào giống như self() trong đó một luồng sẽ trả về một id duy nhất không? –

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