2011-02-13 110 views
3

同步在同一臺計算機上運行的兩個ruby腳本的最佳方式是什麼?在同一臺計算機上同步兩個ruby腳本

腳本將作爲獨立進程從shell啓動。

我希望腳本輪流運行。也就是說,我想要腳本A運行,向腳本B發送一個信號,然後等待腳本B的信號。當腳本B從腳本A獲取信號後,它開始運行,在腳本A完成時向腳本A發出信號,然後等待來自A的信號。基本上,我希望這兩個腳本以交錯方式運行。

實現此同步的最佳方式是什麼?

現在我所能想到的就是創建一個文件作爲信號(每個腳本都忙於循環等待文件被創建)。是否有其他實現更快/更簡單/更安全?

如果它影響到答案,我在OSX上。

+1

是否有任何理由這些必須是2個獨立的腳本?我想不出有這個理由。這些做什麼? – 2011-02-13 07:42:06

回答

2

大概在紅寶石做IPC的最簡單的方法是通過drb和使用Queue,它位於thread

require 'thread' 
queue = Queue.new # provides blocking read 

注意,使用DRB時,你會希望有附近的下面一行您的程序頂部:

Socket.do_not_reverse_lookup=true; 

沒有它,事情運行速度非常緩慢(source)。

要解決問題中描述的特定問題,您可以創建一個Pipe類,其實質上只有兩個Queue對象,一個用於收件箱,一個用於發件箱。 Queue的阻止讀取行爲可以讓進程輕鬆地等待對方。 Pipe通過drb在兩個過程之間共享。

服務器啓動代碼可能是這樣的:

require 'drb' 
Socket.do_not_reverse_lookup=true; 
uri = "druby://localhost:2250" # you can pick a port to communicate on 
pipe = Pipe.new 
DRb.start_service uri, pipe 

客戶端啓動代碼看起來像:

require 'drb' 
Socket.do_not_reverse_lookup=true; 
uri = "druby://localhost:2250" 
DRb.start_service 
pipe = DRbObject.new nil, uri 

現在,客戶端和服務器可以通過Pipe對象溝通。

相關問題