Можно ли кэшировать клиент python suds?

В настоящее время я запускаю python suds для файла wsdl и его соответствующих 50+ файлов xsd. Следующий вызов 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)

person Thierry Lam    schedule 03.11.2010    source источник
comment
Я не уверен, что вы спрашиваете. Можете ли вы объяснить, что вы подразумеваете под кешем client?   -  person Blair Conrad    schedule 03.11.2010
comment
Я добавил код выше, чтобы показать, что я хочу.   -  person Thierry Lam    schedule 03.11.2010


Ответы (3)


suds кэширует файлы WSDL и XSD по умолчанию на день, чтобы каждый экземпляр объекта 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]
person Don Spaulding    schedule 03.11.2010
comment
У меня есть wsdl и соответствующие файлы xsd локально на той же машине, что и сценарии. Я читаю их прямо из файловой системы. Извлечение файла wsdl выполняется быстро, его анализ — медленно. Я думаю, что проблема с suds заключается в том, что он не генерирует никакого кода из wsdl по сравнению с мыльными фреймворками из Java. suds может быть хорош для легких файлов wsdl, но не для больших. - person Thierry Lam; 04.11.2010
comment
Да, если вы загружаете их из файлов, синтаксический анализ является узким местом. Я до сих пор не понимаю, почему бы вам не использовать пену с таким трюком, как описано выше, и просто заправить насос. То есть при запуске пробегитесь по каждому имени клиента и вызовите для него get_client(name), чтобы к моменту поступления первого запроса вы уже загрузили и проанализировали всех клиентов. - person Don Spaulding; 05.11.2010
comment
@ThierryLam, возможно, вы столкнулись с той же проблемой, что и я, а именно: Suds не использует повторно кэшированные WSDL и XSD, хотя я ожидаю, что это будет - person Mike M. Lin; 17.03.2012

если я хорошо понимаю вашу проблему, я думаю, вы не хотите каждый раз создавать новый 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__

NB: я хотел использовать borg pattern, который похож на синглтон, но более красивый, но я не смог понять, как не вызывать Super.init (что занимает много времени) и в то же время делиться то же самое состояние, если у кого-то есть лучшее представление о том, как использовать шаблон Борга, это будет здорово, но я не думаю, что шаблон Борга может быть полезен в этом случае.

Надеюсь, это может помочь

person mouad    schedule 03.11.2010
comment
Действителен ли единый шаблон, когда речь идет о веб-приложениях? Разве каждый HTTP-запрос не будет создавать новый экземпляр Client при первом вызове? Я хочу, чтобы объект Client был постоянным в течение длительного времени. - person Thierry Lam; 04.11.2010
comment
@Thierry Lam: Действителен ли единый шаблон, когда речь идет о веб-приложениях? да, почему не должен? Не будет ли каждый http-запрос создавать новый экземпляр Client при первом вызове? да, идея, когда дело доходит до создания нового экземпляра, если вы уже создали его, просто вернет старый экземпляр без необходимость воспроизвести его, как вы сказали, если первый http-запрос создает экземпляр клиента, а второй раз, когда новый http-запрос попытается создать новый экземпляр класса, Client просто вернет старый экземпляр, который был создан ранее, поэтому повторное подключение не требуется... - person mouad; 04.11.2010
comment
Когда я использую шаблон Singleton для создания клиента и помещаю его в скрипт python, экземпляр по-прежнему имеет значение None во время каждого нового запуска скрипта python. Шаблон singleton не работает, если я хочу, чтобы многие вызовы скрипта Python вызывали один и тот же обработанный объект Client. - person Thierry Lam; 04.11.2010
comment
@Thierry Lam: странно, что экземпляр все еще был None, проверьте мое редактирование, извините, что я не проверил код перед тем, как его вставить, и этот тоже не проверен (нет действительных wsdl url) :), надеюсь, это поможет вам. - person mouad; 04.11.2010

suds >= 0.3.5 r473 обеспечивает некоторое кэширование URL. По умолчанию HTTP-запросы, такие как получение WSDL и импорт XSD, кэшируются.

person panchicore    schedule 11.07.2014