2013-08-02 2 views
3

Итак, у меня есть много внутренних и внешних API, которые вызываются в основном по каждому запросу. Это означает, что существует множество настроек соединений с этими API. Есть ли способ создать постоянный объект соединения, который может быть разделен между запросами?Django постоянные соединения API между запросами

Так что я хотел бы заменить:

def a(request): 
    c = api.connect() 
    c.call_function() 

С:

def b(request): 
    // use existing connection object from earlier request 
    c.call_function() 

Любые идеи?

Я также не уверен, насколько велика будет прибыль, но я не против делать некоторые бенчмаркинга, как только у меня будет первое решение.

ответ

3

Довольно просто действительно

conn = api.connect() # This line is run only once when the process starts and the module is loaded 

def view(request): 
    conn.call_function() # This line is run every time a request is received 

Эта связь будет разделена на любой запрос, используя один и тот же рабочий/сервер процесс. Поэтому, если у вас есть три сотрудника, обслуживающих ваше приложение, у вас будет не более трех соединений.

Я бы позаботился о том, что соединения могут начать отсчет времени. Поэтому вы хотели бы защититься от этого. Возможно, имея функцию, которая проверила состояние соединения, вернула ее, если она была еще хороша, или создала новую, если она истекла.

Почему это работает, можно проиллюстрировать на следующем примере:

>>> a = 1 
>>> def add(b): 
...  print a + b 
... 
>>> add(2) 
3 

Заметим, что вы не можете изменить соединение без использования глобального ключевого слова

>>> def change(c): 
...  a = c 
...  print a 
... 
>>> change(4) 
4 
>>> print a 
1 

Сравнить:

>>> a = 1 
>>> def change(d): 
...  global a 
...  a = d 
...  print a 
... 
>>> change(5) 
5 
>>> print a 
5 
>>> 

Если вы хотите поделиться соединением api между различными рабочими/процессами, это станет немного сложнее. я не беспокоюсь.

+0

Когда я пытаюсь это сделать, я получаю 'local variable 'conn', на который ссылаются перед присваиванием' ... – olofom

+0

Эх ... оказалось, что пока я не пытаюсь установить его, он отлично работает. Таким образом, доступ к conn работает, но если я попытаюсь установить conn дальше вниз (после прочтения), он сбой при чтении ... Я обновлю свой вопрос на примере. – olofom

+0

Почему вы пытаетесь назначить conn? Я думал, что все дело в сохранении связи? Если вы хотите изменить глобальное, вы должны использовать ключевое слово global. – aychedee

0

В дополнение к ответу айджеди я бы предложил вам взглянуть на django's database persistent connections, которые новеньют на Django 1.6. Идея:

Постоянное подключение позволяет избежать перераспределения времени восстановления соединения с базой данных в каждом запросе.

Вы можете реализовать что-то подобное для своих нужд.

Код на Github в Django's 1.6 branch. Это достаточно сложно, но содержит логику проверки соединения и истечения срока действия.

+0

Спасибо, но слишком много для этого проекта. – olofom

Смежные вопросы