4

標準のクライアントサーバーモデルでpyhtonのマルチプロセッシングパッケージを使用しています。サーバーには、メソッドを介して登録し、クライアントからプロキシを介して(クラスに基づいて)使用
するいくつかのタイプのオブジェクトがあります。BaseManager.registerAutoProxy

複数のクライアントスレッドからこれらのプロキシを使用しているときにランダムエラーがポップアップしました。いくつか読んだ後、プロキシインスタンス自体がスレッドセーフではないことがわかりました。Pythonマルチプロセッシングドキュメントから参照してください:

プロキシのスレッドセーフ
ロックで保護しない限り、複数のスレッドのプロキシオブジェクトを使用しないでください。(同じプロキシを使用する異なるプロセスで問題が発生することはありません。)

私のシナリオはこれに完全に適合します。OK、なぜ失敗するのか知っています。しかし、私はそれが機能することを望んでいます:)それで私はアドバイスを求めます-これをスレッドセーフにするための最良の方法は何ですか?
私の特定のケースは、(a)90%の時間、単一のクライアントスレッドで作業し、(b)プロキシの背後にある実際のオブジェクトスレッドセーフであり、(c)同じプロキシの複数のメソッドを呼び出したい場合です。 -同時にオブジェクト。

いつものように、インターネット、私を助けてくれる人は生き続け、決して死ぬことはありません!頑張っている人も慰め賞をもらえるかもしれません。

ありがとう、
ヨナタン

4

1 に答える 1

2

残念ながら、この問題はおそらくあまり多くの人に関係していません:(

将来の読者のために、これが私たちが行っていることです:

  • 「メイン」プロキシの使用を保護するために、通常のスレッドロックを使用します
  • メインプロキシはサーバープロセス内の他のインスタンスにプロキシを提供します。これらはコンテキスト内でスレッド固有であるため、ロックなしで使用します。

あまり興味深い解決策ではありません、ええ、私は知っています。また、ロックが組み込まれたAutoProxy(パッケージはそれをサポート)のカスタマイズされたバージョンを作成することも検討しました。このシナリオがシステムで繰り返される場合は、これを行う可能性があります。自動ロックは慎重に行う必要があります。これは「舞台裏で」行われ、競合状態のデッドロックにつながる可能性があるためです。

将来、誰かが同様の問題を抱えている場合は、コメントするか、直接私に連絡してください。

于 2012-03-05T07:43:03.053 に答える