2016-03-02 2 views
0

Я пытаюсь отключить процессы для детей и следить за тем, продолжает ли процесс или завершился процесс, но я не хочу блокировать и ждать завершения процесса, так как мне нужно иметь возможность продолжать мониторинг для новые входящие запросы и разблокировать дополнительные дочерние процессы по мере необходимости.Ruby fork несколько процессов и статус отслеживания запуска/завершения?

Вот несколько базовых примеров того, что я пытаюсь сделать.

loop do 
    pid = fork do 
    puts 'foo' 
    exit 99 
    end 

    ret_pid = wait2(pid, Process::WNOHANG) # Tried this, but it never gets a value 
    if ret_pid 
    puts 'got a returned pid' 
    end 
end 

Я пытался в ожидании помощи Process::WNOHANG флаг; это не блокирует, но также никогда не появляется какой-либо тип возврата. Я пробовал и wait, и wait2, но никакой разницы.

Я также попробовал ожидание только с использованием wait(pid), который получает статус от дочернего процесса, но это блокирует, поэтому я получаю только один разветвленный процесс, который не приносит мне никакой пользы.

ответ

0

Я не знаю, что для вас важнее, это «проверка статуса дочернего процесса» или возможность «отменить дополнительные дочерние процессы по мере необходимости». В последнем случае, чем это может помочь вам:

queue = ['A','B','C','D'] 
    forks = [] 
    while queue.size > 0 
    q = queue.shift 
    forks << Process.fork do 
     puts q 
    end 

    if forks.size >= 10 
     forks.delete Process.wait 
    end 
    end 

Вы можете продолжать выдвигать новые элементы в очереди или если ваша цель состоит в том, чтобы петля навсегда, то вы можете легко изменить его цикл из while в loop.

С forks.size вы можете установить количество дочерних процессов, являющихся процессами одновременно

Важно знать о Process.wait том, что когда вы не передать ему параметры, она ждет любого дочернего процесса закончить и вернуть pid этого процесса.