使用管道进行Ruby-Python通信的可行性

0 投票
1 回答
898 浏览
提问于 2025-04-17 15:11

目前,我有两个程序,一个是用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更好?

1 个回答

0

是的,不是。如果你实现了,那就是。具体要看你的应用需要什么。

简单来说,如果你只需要简单的数据传递,使用管道就可以了。如果你需要不断地在远程进程中调用对象的函数,那你可能更适合使用现成的远程过程调用(RPC),而不是自己从头开始做。至于用XMLRPC还是其他的方式,那又是另一个问题。

需要注意的是,RPC必须使用某种底层的进程间通信(IPC)机制,这可以是管道,也可以是套接字、消息队列、共享内存等等。

撰写回答