質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

1740閲覧

Rubyプログラムの実行、別プログラムから参照できる?

kzd847686

総合スコア53

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2019/03/06 01:59

Rubyプログラムを実行し、別プログラムからその値を参照できますでしょうか?

あるRubyプログラム(ruby_data.rb)を実行し、そのプログラムで外部からデータをHTTP のGETで毎秒取得し続けています。

別の複数のRubyプログラム(ruby_sum1.rb , ruby_sum2.rb, ruby_sum3.rb, ruby_sum4.rb )を別ターミナルで実行し、
これらのプログラムから、ruby_data.rbで取得したデータを参照することはできるでしょうか。書き換えではなく値を取得するだけです。

今はruby_sum1.rb , ruby_sum2.rb, ruby_sum3.rb, ruby_sum4.rbのそれぞれのプログラムに、ruby_data.rbでの処理をスレッドで実行しているのですが、HTTP GETの回数を減らしたく1つにまとめられたらと思っています。

forkを使えばできるかなとも思いましたが、プログラムが分かれていると厳しいのでしょうか。

ご回答お願い致します。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

druby とか rinda を調査してみると面白いかもしれません。

  • dRubyを使った、分散オブジェクトによる別プロセスの呼び出し

https://dev.classmethod.jp/server-side/ruby-on-rails/druby_distributed_object_other_procerss/

  • タプル空間(Tuple Space)、Linda、JavaSpaces、Ruby Linda(Rinda)

http://www.cs.tsukuba.ac.jp/~yas/cs/csys-2018/2018-07-27/index.html

http://youichi-kato.cocolog-nifty.com/blog/scala/index.html
では,5x5 の魔法陣をつくるのを scala の分散処理でやってみているが、同様のことを druby や rinda でもできるはず。

投稿2019/03/07 15:29

編集2019/03/07 15:29
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kzd847686

2019/03/10 07:13 編集

ありがとうございます!drubyを少し調査してみようと思います。存在を知りませんでしたので助かりました。ありがとうございます。
guest

0

ベストアンサー

初心者がやるなら、ファイルに書き出して、読み出すのが簡単です。

他には、ソケットを使った通信をすることも考えられますが、データ取得しながら配布するというのは、難易度が高いと思います。

並行処理の間でデータを共有するには、他には、1プロセスの中でスレッドに分けて実行すると、変数を共有できますが、これも難易度が高いかと思います。

追記:
ruby_data.rbがずっと動き続けて、データ取得毎に、ruby_sum1.rb,2,3,4を起動するが、ruby_sum1.rb等はすぐ終わると言う事なら、
ruby_data.rbがデータ取得後に、ruby_sum1.rbをIO.popenで起動してそのパイプにデータを書けばruby_sum1.rbは標準入力から読めます。
簡単にやると、sum1,2,3,4は順番に実行ということになりますが。

投稿2019/03/06 02:14

編集2019/03/06 02:30
otn

総合スコア84587

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kzd847686

2019/03/06 04:44

ご回答ありがとうございます。 ruby_sum1.rb,2,3,4も起動し続けます。 ソケット間通信にはIO.pipeが使えるみたいですが、これはあくまでも1つのプログラムの中で、プロセスを分けた場合に参照ができるという事でしょうか。(つまり、本ケースのようにプログラムが複数分かれていては利用できない…?) https://marginalia.hatenablog.com/entry/20170826/1503714718 ちなみに1つのプログラム(.rb)内でスレッドを用いて複数プログラムを動かすのは、ターミナルに出力する情報を分けたいので避けています。
otn

2019/03/06 05:57

ということは、5つのプログラム全部がそれぞれ個別に起動され、全部がずっと動くと言う事ですよね。 であれば、ファイル経由がわかりやすいです。 > ソケット間通信にはIO.pipeが使えるみたいですが、これはあくまでも1つのプログラムの中で、プロセスを分けた場合に参照ができるという事でしょうか。 親子関係にないプロセス間ではパイプは使えません。パイプの口を渡す手段がないので。IO.popenもパイプですが、IO.popenだと、子プロセスとして別プログラムを起動して、その子プロセスとパイプ通信できます。 あるいは、親が作ったパイプを使って子供同士で通信する事はできますので、5つのプログラムの共通の親プロセスを作れば、パイプでの通信はできます。なので、 ・5つのプログラムの起動は一緒で良い ・どれかのプログラムがこけたら、全部止めて、最初から全部起動し直し でいいなら、そういう方法も採れます。 また、親子関係にないプロセス間で使えるパイプとしては、Unix/Linuxだと名前付きパイプがあります。使い方はファイルに似ています。Windowsにもあるようですが、かなり違う物らしい。
otn

2019/03/06 06:00

> ちなみに1つのプログラム(.rb)内でスレッドを用いて複数プログラムを動かすのは、ターミナルに出力する情報を分けたいので避けています。 これだけが問題であれば、各スレッドはメッセージをスレッド毎のファイルに書いて、各端末で`tail -f ~`するという手もあります。Unix/Linuxの場合。
kzd847686

2019/03/10 07:14

もう少し自分で調べてみます。大変助かりました。ありがとうございます!
guest

0

直接変数の参照は厳しいと思います。

例えば渡したいデータをJSONにエンコードし、標準入出力で受け渡し、受け取った側でデコードする、などが簡単かなと思います。

投稿2019/03/06 02:05

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問