目前,我有两个程序,一个在 Ruby 上运行,另一个在 Python 上运行。我需要用 Ruby 读取一个文件,但我首先需要一个用 Python 编写的库来解析文件。目前,我使用 XMLRPC 让两个程序进行通信。将 Python 库移植到 Ruby 是毫无疑问的。但是,我发现并阅读到使用 XMLRPC 会产生一些性能开销。最近,我读到另一个解决 Ruby-Python 难题的方法是使用管道。所以我试着在那个上做实验。例如,我用 ruby 编写了这个主脚本:
(0..2).each do
slave = IO.popen(['python','slave.py'],mode='r+')
slave.write "master"
slave.close_write
line = slave.readline
while line do
sleep 1
p eval line
break if slave.eof
line = slave.readline
end
end
以下是 Python 从站:
import sys
cmd = sys.stdin.read()
while cmd:
x = cmd
for i in range(0,5):
print "{'%i'=>'%s'}" % (i, x)
sys.stdout.flush()
cmd = sys.stdin.read()
一切似乎都很好:
~$ ruby master.rb
{"0"=>"master"}
{"1"=>"master"}
{"2"=>"master"}
{"3"=>"master"}
{"4"=>"master"}
{"0"=>"master"}
{"1"=>"master"}
{"2"=>"master"}
{"3"=>"master"}
{"4"=>"master"}
{"0"=>"master"}
{"1"=>"master"}
{"2"=>"master"}
{"3"=>"master"}
{"4"=>"master"}
我的问题是,在 Ruby 和 Python 之间实现使用管道处理对象真的可行吗?一种考虑是可能有多个 master.rb 实例正在运行。并发会是一个问题吗?管道可以处理广泛的操作和要在其间传递的对象吗?如果是这样,它会是 RPC 的更好选择吗?