0

目前,我有两个程序,一个在 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 的更好选择吗?

4

1 回答 1

0

是的。不,如果你实施它,是的。取决于您的应用程序需要什么。

基本上,如果您只需要简单的数据传递管道就可以了,如果您需要在远程进程中不断调用对象上的函数,那么您可能会更好地使用某种形式的现有 RPC,而不是重新发明轮子。应该是 XMLRPC 还是其他什么是另一回事。

请注意,RPC 必须使用一些底层 IPC 机制,这很可能是管道。但也可能是套接字、消息队列、共享内存等。

于 2013-02-08T03:23:50.057 回答