是否可以缓存python suds客户端?

问题描述 投票:4回答: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)
python soap caching wsdl suds
4个回答
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
投票

你有tried it吗?

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


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模式在这种情况下是有用的

希望这可以提供帮助


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.