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默认将 WSDL 和 XSD 文件缓存一天,以便客户端对象的每个实例化都不需要单独的 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

suds >= 0.3.5 r473 提供一些 URL 缓存。默认情况下,会缓存 http get(s),例如获取 WSDL 和导入 XSD。

于 2014-07-11T15:24:08.890 回答
0

如果我很好地理解了您的问题,我认为您不想每次都创建一个新的 Client() 并且您想放入缓存中以便您可以检索它;但我认为你让事情变得复杂,我建议使用单例模式,这将允许你只创建一个客户端实例,每次你想创建一个新实例时,它只会返回创建的旧实例。

这是一个示例,可以帮助您理解我的建议。

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 回答