Можно ли кешировать клиент Python suds? - PullRequest
4 голосов
/ 03 ноября 2010

В настоящее время я использую 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)

Ответы [ 4 ]

4 голосов
/ 04 ноября 2010

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]
1 голос
/ 03 ноября 2010

Вы пробовали ?

Что касается Python, то проблем быть не должно.Большой проблемой любого кэша является поддержание согласованности, но то, как вы это сделаете, будет зависеть от приложения, а не от Python.

0 голосов
/ 11 июля 2014

suds> = 0.3.5 r473 обеспечивает некоторое кэширование URL. По умолчанию http get (s), такие как получение WSDL и импорт XSD, кэшируются.

0 голосов
/ 04 ноября 2010

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

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

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

...