2016-11-09 4 views
0

私はPythonクラスを永続的に生き生きとしています。その理由は、このクラスは非常にメモリー集約的なため、(1)メモリーに複数回入れられない、(2)クラスのロードが非常に遅いということです。サーバー上に格納されたPythonオブジェクトとやりとりする

PyroRPYCの両方を使用して実装しようとしましたが、これらのパッケージは常に新しいオブジェクトが作成され、新しいオブジェクトが作成されるように見えます。

Pyro4.behavior @(instance_mode = "シングル")

のみ単一のインスタンスが作成されることを保証します。)しかし、私はパイロのための次のオプションを見つけました。しかし、複数のリクエストが同時に行われる可能性があるので、これは安全であると私は100%ではありません。私がやろうとしていることを成し遂げる良い方法がありますか?

事前にお問い合わせいただきありがとうございます。 (私はかなり長い間これを苦労してきた)。

L

+0

Pyroのデフォルトのインスタンスモードでは、リクエストごと*ではなく、セッションごとの*(=プロキシ接続)で新しいインスタンス*を作成しません。 –

+0

これは本当に私のエラーのため申し訳ありません!私はセッションごとに1回のリクエストしかしないので、これは多かれ少なかれ、これは重要な違いです。 –

答えて

1

あなたのクラスのスレッドを安全にしたくない場合は、これは、それはので、すべてのリモートメソッドの呼び出しが順番に処理されているでしょう、"multiplex"SERVERTYPEを設定することができます。

https://pythonhosted.org/Pyro4/servercode.html#server-types-and-concurrency-model

多重サーバ(ServerTypeが "マルチプレックス")

このサーバは、すべてのリモートメソッドを順次呼び出し処理するために接続マルチプレクサを使用します。このサーバーではスレッドは使用されません。それはあなたのプラットフォームで利用可能な最高のサポートセレクタを使用します(kqueue、poll、select)。これは、一度に実行されるメソッド呼び出しが1つだけであることを意味します。完了するまでに時間がかかる場合、他のすべての呼び出しは(別のプロキシからのものであっても)それらの順番を待っています。クラスの登録に使用されるインスタンスモードでは、インスタンスへの同時アクセスの方法は変更されません。すべての場合、常にアクティブなコールは1つだけです。スレッドは存在しないため、オブジェクトは異なるスレッドから同時に呼び出されることはありません。 Pyroがいつどのくらいの頻度であなたのクラスのインスタンスを作成するかはまだ変わりません。

+0

はい。しかし、サーバタイプをこれに設定することは、pyroサーバオブジェクトが同時に呼び出されないようにするためですが、スレッドサーバに置いてpyroサーバクラスのクリティカルセクションを定義し、それらを正しくロックすることも可能です( '' threading .Lock'')。より良い選択肢は、あなたのクラスが何をしているのか、クリティカルセクションでどれくらいの時間を費やすのかによって異なります。 –

+1

このソリューションをお寄せいただきありがとうございます!私はそれを試して、それは完全に動作するようだ。クラスのどの部分がロックされるべきかを実際に調査する時間を見つけることができるまで、私は「マルチプレックス」オプションを使用するつもりだと思います。プログラムはまだまだ開発中です。これは今100%確実です。 –

関連する問題