时间:2010-11-03 20:14:45

标签: python soap caching wsdl suds

我目前正在对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 个答案:

答案 0 :(得分:4)

默认情况下

suds caches WSDL and XSD files一天,以便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]

答案 1 :(得分:1)

你有tried it吗?

就Python而言,应该没有问题。任何缓存的一个大问题是保持一致性,但是你如何做到这一点取决于应用程序,而不是Python。

答案 2 :(得分:0)

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

以下示例可以帮助您了解我的建议。

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 pattern,就像单身但更漂亮,但我无法弄清楚如何不打电话给Super。 init (需要很长时间时间)和平均时间共享相同的状态,如果有人更好地了解如何使用Borg模式,它将是伟大的,但我不认为borg模式在这种情况下有用

希望这可以提供帮助

答案 3 :(得分:0)

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