2

Octave で記述された非常に複雑な計算コードと、ユーザー入力を受け取る Python スクリプトがあり、ユーザー入力に基づいて Octave コードを実行する必要があります。私が見ているように、次のオプションがあります。

  1. Octave コードを Python に移植します。
  2. Python から Octave/Matlab エンジンを実行できるようにする外部ライブラリ (つまり、oct2py) を使用します。
  3. Python プロセスと Octave プロセスの間で通信します。そのような可能性の 1 つは、python コードから subprocess を使用して、答えを待つことです。

私は自分のコードを Python に移植することにかなり消極的であり、oct2py などの外部ライブラリのメンテナンスに頼りたくないので、オプション 3 を支持します。リクエストごとに新しいオクターブ プロセスを生成するには、タスク キュー システムの方が合理的と思われます。Pythonでタスクをキューに入れ、反対側のオクターブワーカーにそれを処理させる(推奨される)タスクキューシステムはありますか?

4

2 に答える 2

2

ここで説明されている方法では、「Octave ワーカー」がタスク キューに接続するための明確な方法 (API またはパッケージ) が Octave にないため、オプション 3 はオプション 2 に退化します。

Octave が「ネットワーキング」を行う唯一の方法は、sockets パッケージを使用することです。これは、タスク キューと通信するためのプロトコルを最初から (Octave で) 実装することを意味します。

「Octave ワーカー」を使用する本来の動機は、関数の呼び出しごとに Octave のメイン プロセスを起動するのではなく、Octave のメイン プロセスを一度起動してから、関数を実行して結果を返すように「指示」することです。

Octave はそのままでは「ワーカー」(起動し、「チャネル」をリッスンし、コードを実行する) を実行できないため、これを実現する唯一の方法は、タスク キュー フレームワークをすべて Python で動作させ、次の場合にのみ Octave を呼び出すことです。おそらくoct2py(つまり、オプション2)を介して、その機能が必要です。

RedisからPyPubSubCeleryおよびRabbitMQに至るまで、これを行うにはさまざまな方法があります。それらはすべて簡単で、非常によく文書化されています。PyPubSub には、追加のコンポーネントは必要ありません。

(注記: 「実行可能な」オクターブ スクリプトを用意し、Python 経由で呼び出し、それが戻るまでブロックするという解決策は、思ったほど悪くはありませんが、一部の並列処理フレームワークでは、複数のコピーを作成する唯一の方法です。同じ Octave スクリプトは、異なるデータ セグメントで動作します。)

于 2015-12-06T10:22:29.997 に答える