在同一台计算机上同步两个ruby脚本

时间:2011-02-13 07:36:13

标签: ruby synchronization

同步在同一台计算机上运行的两个ruby脚本的最佳方法是什么?

脚本将作为独立的进程从shell启动。

我希望脚本轮流运行。也就是说,我希望脚本A运行,向脚本B发送信号,然后等待来自脚本B的信号。当脚本B从脚本A获取信号时,它开始运行,在脚本A完成时发出信号,然后等待来自A的信号。基本上,我希望两个脚本交错运行。

实现此同步的最佳方法是什么?

现在我能想到的就是创建一个文件作为信号(每个脚本忙于循环等待创建一个文件)。还有其他更快/更容易/更安全的实现吗?

如果它影响了答案,我就在OSX上。

1 个答案:

答案 0 :(得分:2)

在ruby中进行IPC的最简单方法可能是通过drb并使用位于Queue的{​​{1}}:

thread

注意,使用drb时,您需要在程序顶部附近放置以下行:

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

没有它,事情就会非常缓慢(source)。

要解决问题中描述的特定问题,您可以创建一个Socket.do_not_reverse_lookup=true; 类,它基本上只有两个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 对象进行通信。