4

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

所以我想更换:

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

和:

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

有任何想法吗?

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

4

2 回答 2

5

真的很简单

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

请注意,如果不使用 global 关键字,您将无法修改连接

>>> 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 连接,它会变得有点棘手。即不要打扰。

于 2013-08-02T09:48:25.600 回答
0

除了aychedee 的回答,我建议您看看django 的数据库持久连接,这是Django 1.6 的新功能。想法:

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

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

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

于 2013-08-02T10:25:37.840 回答