起動してからの処理は速いけど起動するまでが長いpythonプログラムをAとします
処理したい実際の変数が登場するpythonプログラムをBとします
通常の場合、BにAをimportするなどして使用しますが、開発段階でBを何度も起動したり終了したりを繰り返す場合、Aの起動時間のせいでいちいちBの起動時間が遅くなって効率が悪くなります。
そこで、Aを常駐させておいて、Bが処理したい任意のタイミングでAにその変数を投げ、結果をBに返すなどできれば効率が上がると考えました。
調査したこと・試したこと
- threadingやmultiprocessingについて調べてみましたが、これらは1つのpythonプログラム上での並列処理についてのものだと解釈しました。同時に動いている必要のある2つのpythonプログラムの間でのデータのやり取りをしたいと考えているので、この方法では不可能だと解釈しました(間違っていたら教えてください)
- 実行中のプログラム間でのデータのやり取りすることは、localhost内でソケット通信することによって実現はできたのですが、これでは変数が2倍になってしまってちょっとリソースがもったいない気がします。(しかもタイムアウトしてしまいますし。。。)ちゃんと動いているときには、動作自体に問題はなかったので、他にいい方法がなければこの方法を使おうと考えています
実現したいこと
例えば、AをPID xxx で実行するように指定して、Bのプログラム内ではPID xxx に向けてデータを飛ばすと結果が返ってくるようなことはできますか?
PythonのMultiprocessとかどうでしょうか。https://qiita.com/t_okkan/items/4127a87177ed2b2db148
> 変数が2倍になってしまってちょっとリソースがもったいない気がします。
どれぐらいの大きさのデータをやりとりしたいのでしょうか?
データのサイズは2.7MBくらいです
>okukaさん
>PythonのMultiprocessとかどうでしょうか。
こちらは、1つのpythonプログラム内でのマルチスレッドのように見えます。同じ方法を使って、複数の同時に実行されているpythonプログラム間でも値のやり取りはできるのでしょうか?pythonにあまり慣れていないので、これが幼稚な質問でしたら申し訳ありません
> データのサイズは2.7MBくらいです
その程度であれば気にする必要ないのでは?
> 例えば、AをPID xxx で実行するように指定して、Bのプログラム内ではPID xxx に向けてデータを飛ばすと結果が返ってくるようなことはできますか?
できませんが、仮に出来ても、ソケット通信と比べてリソース面での優位性があるのでしょうか?

普通のOSは一般にプロセス間で同じ(データ)メモリ空間をアクセスできないようにしているので、プロセスが分かれる以上一般には複製が必要になります。巨大なデータで複製を許容できない場合は、OSで用意されている共有メモリを使う形にするかと思います。
pythonでは共有メモリを使う場合、標準ではmultiprocessing.shared_memoryを使います。
https://docs.python.org/3.10/library/multiprocessing.shared_memory.html
他にもIPC(Inter-Process Communication)手段はforkベースのものからいろいろあると思いますし、ライブラリも豊富に揃っていると思います。またunixドメインソケットや名前付きパイプなどを使う手段は共有メモリと組み合わせても使えますよ。ただし、この手の機能はOSへの依存度が高いので、OSを明記することと、言語にはあまり依存しない話なので、OSの使いたい機能が分かるならそれを明記した方がいいですね。python以外の言語でしか説明できないなら、別の言語でも分かる人はそれなりにいると思いますよ。
あとソケットを使ったときにタイムアウトする意味が分かりません。
>dameoさん
丁寧な回答ありがとうございます
なるほど、OSにも依存するために、普通は複製して使用する形を取っているんですね
OSについては、基本的にはubuntuを使う予定ですが、windowsでも使う可能性があるためOS依存ならばできれば避けたいと感じました
それから、ソケットがタイムアウトするのは自分の勘違いだったかもしれません。
他の方の意見も参考にした結果、ソケットを使う方向で行こうと考えました

回答2件
あなたの回答
tips
プレビュー