2013-04-02 39 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因为原来的过程是“胖”,即。占用大量内存,分叉会复制东西。 –

+0

为什么不把它放在另一个脚本中,而是调用它呢? – squiguy

回答

1

在基于Unix的系统上,fork(3)是创建新进程的唯一方法。你必须有能力去完成你所描述的内容。

如果因为父进程“胖”而占用大量内存而试图避免分叉,则可以通过使用实现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''',但是用于独立的Ruby代码块。 –

+0

已更新的答案.. –

+0

是否有可能从主线程的父级像'''(get_parent_process).fork {p.call}'''那样实现分叉? –

相关问题