使用管道进行ruby-python通信的可行性

使用管道进行ruby-python通信的可行性,python,ruby,Python,Ruby,目前,我有两个程序,一个运行在Ruby上,另一个运行在Python上。我需要用Ruby读取一个文件,但首先需要一个用Python编写的库来解析该文件。目前,我使用XMLRPC让这两个程序进行通信。将Python库移植到Ruby是毫无疑问的。但是,我发现并了解到使用XMLRPC会带来一些性能开销。最近,我读到Ruby Python难题的另一个解决方案是使用管道。所以我试着用这个做实验。例如,我用ruby编写了这个主脚本: (0..2).each do slave = IO.po

目前,我有两个程序,一个运行在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的更好替代方案?

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

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


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

“如果您需要在远程进程中不断调用对象上的函数,那么您最好使用某种形式的现有RPC,而不是重新发明轮子”-为什么会这样?我对这些技术还比较陌生,所以稍加阐述可能会有所帮助。因为RPC(远程过程调用)和IPC(进程间通信)是完全不同的东西。IPC只是关于数据,RPC是关于更高级别的语义(数据序列化、调用约定和封装等)。如果我错了,RPC通常会使用某种形式的IPC来处理较低级别的数据,在我看来,直接使用管道比使用RPC更简单,并且它可以转化为性能增益。只有当您实现的比RPC实现为您所做的更少时。如果只进行简单的数据传递,那么情况就是这样。恐怕我确实需要函数调用来生成要在管道上传递的对象。所以,正如您所说,现有RPC的管道“翻译”不会带来任何好处。这可能有点离题,但还有更好的选择吗?