同步在同一台计算机上运行的两个ruby脚本的最佳方法是什么?
脚本将作为独立的进程从shell启动。
我希望脚本轮流运行。也就是说,我希望脚本A运行,向脚本B发送信号,然后等待来自脚本B的信号。当脚本B从脚本A获取信号时,它开始运行,在脚本A完成时发出信号,然后等待来自A的信号。基本上,我希望两个脚本交错运行。
实现此同步的最佳方法是什么?
现在我能想到的就是创建一个文件作为信号(每个脚本忙于循环等待创建一个文件)。还有其他更快/更容易/更安全的实现吗?
如果它影响了答案,我就在OSX上。
答案 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
对象进行通信。