4

現在、wsdl ファイルとそれに対応する 50 以上の xsd ファイルに対して python suds を実行しています。次の呼び出しにClientは約 90 秒かかります。

from suds.client import Client
url = 'http://localhost:7080/webservices/WebServiceTestBean?wsdl'
client = Client(url)

上記の最後の行を実行すると、Clientインスタンスが取得されます。そのクライアントの作成には時間がかかります。キャッシングは Python オブジェクトで機能しますか、それとも文字列や整数などのプリミティブに限定されますか?

コードでやりたいことは次のとおりです。構文は間違っていますが、必要なものを伝えるためです。

from suds.client import Client


if 'current_client' in cache:
    client = cache.get('current_client')
else:
    url = 'http://localhost:7080/webservices/WebServiceTestBean?wsdl'
    client = Client(url)
    cache.put('current_client', client)
4

3 に答える 3

4

sudsは、デフォルトで1日のWSDLファイルとXSDファイルをキャッシュするため、Clientオブジェクトのインスタンス化ごとに個別のURLリクエストは必要ありません。

90秒は本当に長い時間のように思えますが、その時間はwsdl応答の待機に費やされたのでしょうか、それともwsdlの解析に費やされたのでしょうか。解析にそれほど時間がかかる場合は、組み込みのキャッシュはあまり役に立ちません。

以前にこのようなことをしたことがありますが、シングルトンパターンの代わりに、モジュールレベルのグローバルディクショナリを使用しました。classノイズのないシングルトンパターンです。

このようなもの:

from suds.client import Client

_clients = {}

def get_client(name):
    if name not in _clients:
        _clients[name] = Client(url_for_name)
    return _clients[name]
于 2010-11-03T22:19:00.560 に答える
0

私があなたの問題をよく理解していれば、毎回 new Client() を作成したくないと思い、それを取得できるようにキャッシュに入れたいと思います; しかし、あなたは物事を複雑にしていると思います。シングルトン パターンを使用することをお勧めします。これにより、クライアントのインスタンスを 1 つだけ作成でき、新しいインスタンスを作成するたびに、作成された古いインスタンスが返されます。

これは、私が提案していることを理解するのに役立つ例です。

class MyClient(Client):

    __instance__ = None

    def __new__(cls, *args, **kws):
        if not cls.__instance__:
            cls.__instance__ = super(Client, cls).__new__(cls, *args, **kws)
        return cls.__instance__

注意: シングルトンに似ているが、より美しいborg パターンを使用したかったのですが、Super を呼び出さない方法がわかりませんでした。init (これには長い時間がかかります) とその間に同じ状態を共有します。誰かが Borg パターンを使用してそれを配置する方法についてより良いアイデアを持っている場合、それは素晴らしいことですが、borg パターンが役立つとは思いませんこの場合

これが役立つことを願っています

于 2010-11-03T21:04:17.957 に答える
0

suds >= 0.3.5 r473 は、いくつかの URL キャッシュを提供します。デフォルトでは、WSDL の取得や XSD のインポートなどの http get(s) がキャッシュされます。

于 2014-07-11T15:24:08.890 に答える