また、メッセージキューよりも良いデータの受け渡し方法があればご意見伺いたいです。
他の回答にあるように、Pythonを介さずに、Rustから機械学習ライブラリーのコアが使えるなら、それが一番効率が良いと思います。
次に効率が良さそうなのはPyO3を使う方法です。以下のことができます。
- PythonモジュールをRustで書き、Pythonコードから呼ぶ。(Rustコードは共有ライブラリーへとコンパイルされ、Pythonインタープリターがそれをロードして使う)
- Rustコード内でPythonインタープリターを起動し、Pythonコードを実行する
Pythonのデータ型からRustのデータ型への変換と、その逆の変換は、単純な型ならPyO3が自動的に行ってくれます。
「質問への追記・修正依頼」欄のコメントからすると、Rustを主にして、機械学習はPythonにということだと思いますので、2.の形態の方が合っているように見えます。ただ、機械学習の場合は、C/C++で書かれたネイティブライブラリーに依存していますので、動作させるために必要な設定を見つけるのが大変かもしれません。
1.の形態なら簡単かつ確実に動作するのでないかと思います。その場合、質問にある1の処理と3の処理はPyO3+Rustで実装し、Pythonコードから呼ぶことになります。
PyO3以外の連携方法は大体以下のようになるでしょうか。(「質問への追記・修正依頼」に他の方が書かれたものと基本的に同じです)
- ファイル(物理的メディア、または、RAMディスク)で連携する
- コマンドラインでPythonを実行して、標準出力に書かれた情報を使う
- REST APIやgRPC APIで連携する
- メッセージキューで連携する
2.は、もし毎秒発生するデーターをその都度処理したいのでしたら、ちょっと無理がありそうです。(機械学習の処理は、どの程度の時間がかかるのでしょうか? 1秒以内 or それ以上?)
3と4は実装が面倒そうなのと、実行時のオーバーヘッド(本来の処理以外にかかる時間)も大きそうです。