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

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

ただいまの
回答率

90.03%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 512

kzd847686

score 45

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を使えばできるかなとも思いましたが、プログラムが分かれていると厳しいのでしょうか。

ご回答お願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

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

並行処理の間でデータを共有するには、他には、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 13:44

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


    ちなみに1つのプログラム(.rb)内でスレッドを用いて複数プログラムを動かすのは、ターミナルに出力する情報を分けたいので避けています。

    キャンセル

  • 2019/03/06 14:57

    ということは、5つのプログラム全部がそれぞれ個別に起動され、全部がずっと動くと言う事ですよね。
    であれば、ファイル経由がわかりやすいです。

    > ソケット間通信にはIO.pipeが使えるみたいですが、これはあくまでも1つのプログラムの中で、プロセスを分けた場合に参照ができるという事でしょうか。

    親子関係にないプロセス間ではパイプは使えません。パイプの口を渡す手段がないので。IO.popenもパイプですが、IO.popenだと、子プロセスとして別プログラムを起動して、その子プロセスとパイプ通信できます。
    あるいは、親が作ったパイプを使って子供同士で通信する事はできますので、5つのプログラムの共通の親プロセスを作れば、パイプでの通信はできます。なので、
    ・5つのプログラムの起動は一緒で良い
    ・どれかのプログラムがこけたら、全部止めて、最初から全部起動し直し
    でいいなら、そういう方法も採れます。

    また、親子関係にないプロセス間で使えるパイプとしては、Unix/Linuxだと名前付きパイプがあります。使い方はファイルに似ています。Windowsにもあるようですが、かなり違う物らしい。

    キャンセル

  • 2019/03/06 15:00

    > ちなみに1つのプログラム(.rb)内でスレッドを用いて複数プログラムを動かすのは、ターミナルに出力する情報を分けたいので避けています。

    これだけが問題であれば、各スレッドはメッセージをスレッド毎のファイルに書いて、各端末で`tail -f ~`するという手もあります。Unix/Linuxの場合。

    キャンセル

  • 2019/03/10 16:14

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

    キャンセル

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/10 16:13 編集

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る