0

現在、Ruby で実行するプログラムと Python で実行するプログラムの 2 つがあります。Ruby でファイルを読み取る必要がありますが、まずファイルを解析するために Python で記述されたライブラリが必要です。現在、私は XMLRPC を使用して 2 つのプログラムを通信させています。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 の間でオブジェクトを操作するためのパイプの使用を実装することは本当に実現可能ですか? 1 つの考慮事項は、master.rb の複数のインスタンスが実行されている可能性があることです。同時実行性は問題になりますか? パイプは大規模な操作とその間で渡されるオブジェクトを処理できますか? もしそうなら、それは RPC のより良い代替でしょうか?

4

1 に答える 1

0

はい。いいえ。実装する場合は、はい。アプリケーションのニーズによって異なります。

基本的に、必要なのが単純なデータ受け渡しパイプだけである場合、リモートプロセス内のオブジェクトで関数を常に呼び出す必要がある場合は、車輪の再発明を行うのではなく、何らかの形式の既存のRPCを使用する方がよいでしょう。それがXMLRPCなのか、それとも他の何かなのかは別の問題です。

RPCは、パイプなどの基盤となるIPCメカニズムを使用する必要があることに注意してください。ただし、ソケット、メッセージキュー、共有メモリなどもあります。

于 2013-02-08T03:23:50.057 に答える