2013-05-14 2 views
5

저는 두 개의 webrick 서버를 시작하는 두 개의 프로세스를 포크해야하는 보석을 작성하고 있습니다. 기본 클래스의 클래스 메소드를 통해이 서버를 시작하려고합니다. 여러 개의 서버가 아닌이 두 개의 서버 만 실행해야하기 때문입니다. 런타임 중에이 두 서버에서 변수를 변경하기 위해 일부 메소드를 호출하려고합니다.루비 프로세스를 통해 변수 공유

내 문제는 기본 클래스의 클래스 메서드를 통해 포크의 인스턴스 변수에 액세스 할 수 없다는 것입니다. 또한 기본 클래스 내에서는 스레드를 사용할 수 없습니다. 왜냐하면 후드에서 스레드 안전하지 않은 다른 라이브러리를 사용하고 있기 때문입니다. 그래서 각 서버를 자신의 프로세스로 분기해야합니다.

@@server과 같은 클래스 변수를 사용해 보았습니다. 그러나 기본 클래스를 통해이 변수에 액세스하려고하면 nil이됩니다. 나는 루비에서 포크 중 클래스 변수를 공유하는 것이 불가능하다는 것을 읽었다. 맞습니까?

그래서이 문제를 해결하는 다른 방법이 있습니까? 싱글 톤을 사용하는 것을 생각했지만 이것이 최선의 아이디어인지 확실하지 않습니다.

+0

[프로세스 간 통신 (http://en.wikipedia.org/wiki/Inter-process_communication가) –

+0

그냥 링크가 조금 덜입니다, 내가 프로세스 간 통신을 알고)하지만 할 정말 XML 인터페이스를 구현하거나 시스템 고유의 프로토콜을 처리해야합니다. Ruby 프로세스가 분리되어 있기 때문에 IPC는 (최상위 레벨에서) 문제를 해결할 수있는 유일한 방법입니다. – 23tux

+0

@ 23tux : 루비 프로세스는 별도입니다. 루비 보석이 많이 있습니다. 아마도 데이터를 디스크에 '마샬링'할 수 있습니다. 추가 할 필요가있는 부분은 잠금 (부분 읽기/쓰기를 방지하기 위해) 뿐이며 성능에 유의하십시오. 다음은 디스크를 만지지 않도록 로컬'memcached '에 마샬링 할 수 있습니다. . . –

답변

8

프로세스를 포크하면 하위 프로세스와 상위 프로세스의 메모리가 분리되므로 직접 변수를 공유 할 수 없습니다. 따라서 싱글 톤 클래스는 귀하의 경우에는 작동하지 않습니다.

솔루션은 IPC이다 루비 적어도 * 괜찬아에 IPC의 두 가장 많이 사용되는 형태가되는 양 pipessockets 지원한다. 좀 더 투명한 인터페이스가 필요하다면 Ruby는 distributed objects도 지원합니다.

당신이 선택한 것은 직업에 따라 다릅니다. 어떤 시점에서 여러 컴퓨터에 프로세스를 분할하려는 경우 소켓 또는 drb로 이동하십시오. 파이프와 함께 가지 않으면.

Here's a short introduction to pipes in Ruby

관련 문제