2013-04-02 69 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}'''那樣實現分叉? –

相關問題