2013-04-02 3 views
3

블록이나 Proc에 정의 된 코드를 별도의 프로세스로 생성하는 솔루션을 찾고 있습니다.별도의 프로세스에서 코드를 실행하는 방법은 무엇입니까?

p = Proc.new do 
    File.open('newproc.log', 'w') { 
    |fw| 
    10.times do 
     fw.puts Time.now 
     sleep 1 
    end 
    } 
end 

# spawn p in a separate process here 

# original code continues 

같은 뭔가 없음 프로세스 포크 (fork), 스레딩, 외부 파일에 전혀 저장. 독립 실행 형 프로세스에서 블록을 실행하기 만하면됩니다.

아이디어가 있으십니까?

업데이트 : 블록을 추가하는 과정은 호출 프로세스에서 정의 된 것에 의존하지 않습니다.

+0

왜 포크 (fork)? –

+0

@SergioTulentsev 원래 프로세스가 "뚱뚱"하기 때문에. 많은 메모리를 차지하고 포크는 물건을 복제합니다. –

+0

왜 다른 스크립트에 넣고 대신 호출할까요? – squiguy

답변

1

Unix 기반 시스템에서 fork(3)은 새 프로세스를 만드는 유일한 방법입니다. 당신은 당신이 묘사하고있는 것을 성취하기 위해 포크를 할 수 있어야합니다.

부모 프로세스가 "뚱뚱"하고 많은 메모리를 차지하기 때문에 fork하지 않으려는 경우 Copy-on-Write을 구현하는 Ruby 버전 (예 : Ruby 2.0)을 사용하여 메모리가 중복되지 않도록 할 수 있습니다. 그리고 스레드는 별도의 프로세스보다 훨씬 적은 메모리를 사용하므로 스레딩은 반드시 고려해야 할 가치가 있습니다.

편집

다음과 같을 수 fork를 사용하는 솔루션 :

p = Proc.new do 
    File.open('newproc.log', 'w') { 
    |fw| 
    10.times do 
     fw.puts Time.now 
     sleep 1 
    end 
    } 
end 

# spawn p in a separate process here 
fork { p.call } 

# original code continues 
+0

하지만 주 프로세스의 부모로부터 블록 코드를 어떻게 포크 할 수 있습니까? ''''Kernel :: spawn''과 같은 것이지만, 루비 코드의 독립적 인 블록을위한 것입니다. –

+0

updated 대답 .. –

+0

'''(get_parent_process) .fork {p.call}'''와 같이 주 스레드의 부모로부터 분기 할 수 있습니까? –

관련 문제