2013-05-14 31 views
5

Tôi đang viết một viên ngọc, nơi tôi phải chia hai quy trình đang khởi động hai máy chủ webrick. Tôi muốn bắt đầu các máy chủ này thông qua một phương thức lớp từ một lớp cơ sở, bởi vì chỉ có hai máy chủ này đang chạy, không phải là nhiều máy chủ. Trong suốt thời gian chạy, tôi muốn gọi một số phương thức trên hai máy chủ này để thay đổi các biến.Chia sẻ biến thông qua các quá trình ruby ​​

Vấn đề của tôi là, tôi không thể truy cập các biến mẫu của các nhánh, thông qua một phương thức lớp của lớp cơ sở. Hơn nữa, tôi không thể sử dụng các chủ đề bên trong lớp cơ sở của tôi, bởi vì dưới mui xe Tôi đang sử dụng một thư viện mà không phải là thread an toàn. Vì vậy, tôi phải ngã ba mỗi máy chủ để quá trình riêng của nó.

Tôi đã thử với biến lớp học, chẳng hạn như @@server. Nhưng khi tôi cố gắng truy cập các biến này thông qua lớp cơ sở, nó là nil. Tôi đọc rằng chia sẻ các biến lớp giữa các nhánh là không thể trong Ruby, tôi có đúng không?

Vì vậy, có cách nào khác xung quanh vấn đề này không? Tôi đã nghĩ đến việc sử dụng một singleton, nhưng tôi không chắc đây có phải là ý tưởng hay nhất hay không.

+0

[liên quá trình giao tiếp] (http://en.wikipedia.org/wiki/Inter-process_communication) –

+0

Chỉ cần một liên kết là một chút ít;) Tôi biết liên lạc quá trình, nhưng làm Tôi thực sự phải thực hiện một giao diện XML, hoặc đối phó với hệ thống protocolls cụ thể để đạt được điều này? Tôi nghĩ, có thể có một "cách ruby" để làm điều này – 23tux

+0

@ 23tux: các quy trình Ruby là riêng biệt, IPC là (ở cấp cao nhất) là cách duy nhất để giải quyết vấn đề của bạn. Có rất nhiều đá quý Ruby có thể giúp mặc dù. Bạn có thể có thể chỉ là 'So sánh 'dữ liệu của bạn vào đĩa - tất cả những gì bạn cần thêm là một số khóa (để tránh đọc/viết một phần) và theo dõi hiệu suất. Tiếp theo có thể là marshalling đến một địa phương 'memcached' để tránh chạm vào đĩa. . . –

Trả lời

8

Khi bạn ngã ba một quá trình, bộ nhớ của tiến trình con và cha mẹ được tách ra, do đó bạn không thể chia sẻ trực tiếp các biến giữa chúng. Vì vậy, một lớp singleton sẽ không hoạt động trong trường hợp của bạn.

Giải pháp là IPC, Ruby hỗ trợ cả hai pipessockets, đây là hai dạng IPC được sử dụng nhiều nhất, ít nhất là trên * NIX. Ruby cũng hỗ trợ distributed objects, nếu bạn cần giao diện trong suốt hơn.

Điều bạn chọn tùy thuộc vào công việc. Nếu bạn biết bạn muốn tách bạn xử lý trên một số máy tính tại một số điểm, đi với ổ cắm hoặc drb. Nếu không đi với đường ống.

Here's a short introduction to pipes in Ruby

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