【问题标题】:Django persistent API connections between requests请求之间的 Django 持久 API 连接
【发布时间】:2013-08-03 12:20:06
【问题描述】:

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

所以我想替换:

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

与:

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

有什么想法吗?

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

【问题讨论】:

    标签: python django persistent-connection


    【解决方案1】:

    真的很简单

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

    【讨论】:

    • 嗯...事实证明,只要我不尝试设置它就可以正常工作。所以访问 conn 是可行的,但是如果我尝试将 conn 设置得更远(在阅读之后),它会在阅读时崩溃……我将用示例更新我的问题。
    • 你为什么要分配给 conn?我以为重点是保持联系?如果要更改全局,则必须使用 global 关键字。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢,但这个项目有点过分了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2015-08-29
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多