¿Es posible almacenar en caché un cliente de sudaderas de Python?

Actualmente estoy ejecutando suds de Python contra un archivo wsdl y sus correspondientes 50+ archivos xsd. La siguiente llamada al Client tarda unos 90 segundos:

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

Después de ejecutar la última línea anterior, obtengo una instancia de Client . Crear ese cliente lleva mucho tiempo. ¿Funciona el almacenamiento en caché con objetos de Python o está restringido a primitivas como cadenas y enteros?

Esto es lo que quiero hacer en código, la syntax es incorrecta pero es para transmitir lo que quiero:

 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) 

Suds almacena en caché los archivos WSDL y XSD durante un día de manera predeterminada, de modo que cada creación de instancias de un objeto Cliente no requiera una solicitud de URL por separado.

90 segundos parece un tiempo realmente largo, ¿es ese tiempo dedicado a esperar en la respuesta de wsdl, o se gasta analizando el wsdl? Si toma tanto tiempo analizarlo, el almacenamiento en caché integrado no va a ayudar mucho.

He hecho algo como esto antes, pero en lugar del patrón de singleton, solo usé un diccionario global a nivel de módulo. Es el patrón singleton sin todo el ruido de la class .

Algo como esto:

 from suds.client import Client _clients = {} def get_client(name): if name not in _clients: _clients[name] = Client(url_for_name) return _clients[name] 

¿Lo has probado ?

En lo que respecta a Python, no debería haber ningún problema. El gran problema con cualquier caché es mantener la consistencia, pero cómo hacerlo dependerá de la aplicación, no de Python.

si entiendo bien su problema, creo que no desea crear cada vez un nuevo Cliente () y que desea poner en un caché para poder recuperarlo; pero creo que estás complicando las cosas y sugeriré usar el patrón de singleton, esto te permitirá crear solo una instancia del cliente y cada vez que quieras crear una nueva instancia, solo devolverá la instancia antigua que se creó.

Aquí hay un ejemplo que puede ayudarlo a comprender lo que estoy sugiriendo.

 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__ 

NB: quería usar el patrón de Borg, que es como singleton pero más hermoso, pero no pude averiguar cómo no llamar a Super. init (que lleva mucho tiempo) y mientras tanto se comparte el mismo estado, si alguien tiene una mejor idea de cómo ponerlo usando el patrón de Borg, será genial, pero no creo que el patrón de Borg pueda ser útil en este caso

Espero que esto pueda ayudar

suds> = 0.3.5 r473 proporciona algún almacenamiento en caché de URL. De manera predeterminada, los datos http (http) como el WSDL y la importación de XSD se almacenan en caché.