2012-07-17 5 views
1

resque를 사용 중입니다. 큐 프로세서는 실행 과정에서 쉘 프로세스를 시작합니다. 현재 PTY.spawn()을 사용하여 쉘 명령을 호출하고 출력을 처리합니다.Ruby에서 자식 프로세스 동시 생성하기

숫자 (N)을 부여 할 수 있도록이 코드를 보완하고 싶습니다 (온보드 VM을 실행 한 명령, 한 번의 호출로 가변 숫자를 시작할 수 있음). N 번째 호출이 N-1 번째 호출을 마칠 때까지 대기하지 않고도 별도의 프로세스에서 N 번 호출했습니다. 또한 각 호출에서 모든 STDOUT을 캡처하므로 호출이 완료되면 출력 작업을 수행 할 수 있습니다.

나는 Kernel::fork을 보았지만 fork 된 블록 내부의 코드 범위는 그 부모와 동일하지 않습니다 (꽤 분명한 이유로).

각 프로세스를 독립적으로 생성하고 출력을 캡처 할 수 있도록 사용할 수있는 도구가 있습니까? 계속 진행하기 전에 부모 프로세스가 모두 완료 될 때까지 기다릴 수 있습니까? 여기

답변

1

:

당신은 단지 그들을 산란 및 STDOUT/STDIN 쌍의 무리를 얻을 경우 아주 기본적인이다
stdouts=[] 
numberOfProcesses.times do 
    stdouts<<PTY.spawn(command_line)[0..-1] 
end 

. 당신이 즉시 완료로 각 프로세스의 출력 작업을 할 수있게하려면,이 시도 : 병렬로 급부상

threads=[] 
numberOfProcesses.times do 
    threads<<Thread.new(command_line) |cmd| 
    stdout, stdin, pid = PTY.spawn(cmd) 
    Process.waitpid(pid) 
    process_output(stdout.read) 
    end 
end 
threads.each {|t| t.join} 

, 각 스레드가 인스턴스가 완료되는 때를 기다리고. 인스턴스가 완료되면 출력을 처리하고 반환합니다. 주 스레드는 다른 모든 스레드가 완료 될 때까지 대기합니다.

+0

이것에 대해 명확하게 설명해 주시겠습니까? Thread.new 또는 t.join을 호출 할 때 스레드가 처리를 시작합니까? – asfallows

+0

@asfallows :'Thread.new'. 't.join'은 스레드가 완료되기를 기다립니다. – Linuxios

+0

감사! 나는 이것을 가지고 놀 것이다. 내가 필요한 것이어야한다. – asfallows

관련 문제