3

jythonとpythonの通信リンクを作りたいと思っています。フロントエンドに使用するdjangoアプリとpythonスクリプトがあり、システム管理/自動化タスクを実行しています。私は Weblogic 9/10 に jython を使用しています。私がやりたいことは、jython システムに要求を与えることができるようにすることです。引数a、b、cを持つタスクAのように、完了したらメッセージを返します。

wlst または jython の起動が遅く、デプロイを実行する必要があるとき、またはサーバーまたはサーバー (現在は最大 100) のステータスを確認する必要があるときに、これを実行するのが面倒になるため、これを実行したいと考えています。では、jython/(wlst) システムを維持しながら、メイン スクリプトまたは Python クラスに情報を共有し、リクエストを簡単に共有/作成できる最も簡単な方法はどれでしょうか?

私が行ってきた方法は、pickle オブジェクトを使用することです。すべてのデータを取得し、それをファイルに吐き出してから、そのファイルを python app/script にロードし直します。

4

3 に答える 3

3

Celeryやその他の標準的な Queue/Broker メッセージング システムを検討しましたか? django-celery は非常に成熟しており、よく開発されており、この種のタスク用に特別に設計されています。

Django -> Celery --> Worker Process (always running)
           ^     |-> Worker Process
           |     `-> Worker Process -,
           \______ Job Complete _____/

基本的な考え方は、(1 つ以上のサーバー上で) メッセージが来るのを待っているワーカー プロセスを常に実行しているということです (これらは、ピクルされたオブジェクトや json など、必要なものであれば何でもかまいません)。これらのプロセスはアイドル状態で、Celery (およびこれは RabbitMQ バックエンド) がメッセージ/ジョブを送信するのを待っています。メッセージ/ジョブが処理されると、通知がブローカーを介して返され、django でステータスを更新するコールバックが呼び出されます。

Celery は、分散メッセージ パッシングに基づくタスク キュー/ジョブ キューです。リアルタイム操作に重点を置いていますが、スケジューリングもサポートしています。

タスクと呼ばれる実行単位は、1 つ以上のワーカー サーバーで同時に実行されます。タスクは、非同期 (バックグラウンド) または同期 (準備が整うまで待機) で実行できます。

于 2011-09-09T01:46:20.837 に答える
2

この種のメッセージングには、将来のプロジェクトで何度も使用できる、実際の言語に依存しないメッセージ キューイング システムを使用するのが好きです。すべてのキューを管理する途中でメッセージ キュー ブローカーを処理できる場合は、AMQP を調べてください。または、サードパーティのブローカーが必要ない場合は、ZeroMQ をご覧ください。

どちらの場合も、必要に応じてキューごとに複数のワーカーを処理できる sub-pub キューを使用してメッセージを送信できます。メッセージは、単純なテキスト文字列http://tnetstrings.org/または JSON オブジェクトのいずれかである可能性があります。また、慎重に実行すれば、実行するコードと共に pickle 化された Python オブジェクトを送信することもできます。個人的には、JSON オブジェクト (JSON のサブセット) を使用するのが好きで、それらを Python dict にアンパックして使用します。

約 20 の通信 Python プロセスを持つシステムで AMQP と ZeroMQ の両方を使用しました。これはうまく機能し、Python 以外のものに接続する必要がある場合は、既に AMQP モジュールと ZeroMQ ライブラリが存在することがわかります。

シナリオの興味深い拡張は、Jython、CPython、および IronPython で記述された 3 種類のワーカー プロセスを持つことです。そうすれば、サードパーティの Java および .NET モジュールだけでなく、lxml などのバイナリ CPython モジュールも活用できます。プロセスが完全に分離され、必要に応じて複数のサーバーで実行できるように、Redis などと組み合わせます。ワーカーは、大きなメッセージと小さなメッセージを交互に配置してメッセージ キューイング システムを台無しにする代わりに、結果を Redis に入れます。必要に応じて、ワーカーは Redis キーを含むメッセージを発行して、別のプロセスが値を取得できるようにすることができます。

于 2011-09-09T02:03:31.740 に答える
-1

酸洗は問題ありません。効率を高めるために cPickle を使用してください。ただし、ファイルに書き込むべきではありません。代わりに、ディスクのオーバーヘッドを回避するソケットやパイプなどの他の IPC メカニズムを使用します (つまり、https://stackoverflow.com/search?q=python+named+pipesを参照)。

于 2011-09-08T07:21:28.627 に答える