2013-04-02 2 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 

Нет процесс разветвления, ни резьба, не сохранение во внешнем файле. Просто выполнение блока в автономном процессе.

Любая идея?

Обновление: Я должен добавить блок, не зависит от того, что определено в вызывающем процессе.

+0

Почему нет разветвление? –

+0

@SergioTulentsev Поскольку оригинальный процесс является «жирным», т.е. занимает много памяти, а forking дублирует вещи. –

+0

Почему бы не поместить его в другой скрипт и назвать это вместо этого? – squiguy

ответ

1

В системах на основе Unix fork(3) - это единственный способ создать новый процесс. У вас должна быть способность развиваться, чтобы выполнить то, что вы описываете.

Если вы пытаетесь избежать порождения, поскольку родительский процесс «жир» и занимает много памяти, вы можете быть в состоянии избежать дублирования памяти, используя версию Ruby (например, как Ruby 2.0), который реализует Copy-on-Write. И потоки потребляют гораздо меньше памяти, чем отдельный процесс, поэтому, конечно, стоит обратить внимание на потоки.

Редактировать

Раствор с помощью 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''', но для независимого блока кода ruby. –

+0

обновленный ответ .. –

+0

Можно ли добиться форкирования от родителя основного потока, такого как '' '(get_parent_process) .fork {p.call}' ''? –