Django请求之间的持久API连接

时间:2013-08-02 09:26:45

标签: python django persistent-connection

所以我有很多基本上每个请求都要调用的内部和外部API。这意味着有很多设置与这些API的连接。有没有办法创建可以在请求之间共享的持久连接对象?

所以我想替换:

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

使用:

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

有什么想法吗?

我也不确定收益会有多大,但是一旦我有了第一个解决方案,我不介意做一些基准测试。

2 个答案:

答案 0 :(得分: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连接,那就变得有点棘手了。即不要打扰。

答案 1 :(得分:0)

除了aychedee的回答,我建议你看看django's database persistent connections,这是Django 1.6的新功能。想法:

  

持久连接避免了在每个请求中重新建立与数据库的连接的开销。

您可以根据自己的需要实施类似的东西。

Django's 1.6 branch中Github上的代码。它足够复杂,但包含连接到期和可用性检查逻辑。