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