現在、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 のより良い代替でしょうか?