异步 Django 模型查询是不是可行?

Posted

技术标签:

【中文标题】异步 Django 模型查询是不是可行?【英文标题】:Are asynchronous Django model queries possible?异步 Django 模型查询是否可行? 【发布时间】:2010-10-29 10:22:08 【问题描述】:

我是 Django 新手,但我想到的应用程序最终可能会具有如下所示的 URL:

http://mysite/compare/id_1/id_2

其中“id_1”和“id_2”是两个不同模型对象的标识符。在“比较”的处理程序中,我想异步并行地查询和检索对象 id_1 和 id_2。

有没有办法使用标准的 Django 语法来做到这一点?我希望伪代码最终看起来像这样:

import django.async 

# Issue the model query, but set it up asynchronously.  
# The next 2 lines don't actually touch my database 
o1 = Object(id=id_1).async_fetch()
o2 = Object(id=id_2).async_fetch()

# Now that I know what I want to query, fire off a fetch to do them all
# in parallel, and wait for all queries to finish before proceeding. 

async.Execute((o2,o2))

# Now the code can use data from o1 and o2 below...

【问题讨论】:

因为一切都被缓存了,我怀疑你会从这种事情中看到任何好处。您的对象获取真的是应用程序中最慢的部分吗? 一切都不会被缓存,这实际上只是我正在考虑的实际设计的一个简单版本。想象一下论坛软件的“获取此线程中的所有帖子”之类的东西。帖子的数量可能非常大(1000 条),并且访问模式可能不会全部缓存。 【参考方案1】:

没有您所描述的严格的异步操作,但我认为您可以通过使用 django 的 in_bulk 查询运算符来达到相同的效果,该运算符需要一个 id 列表进行查询。

urls.py 是这样的:

urlpatterns = patterns('',
    (r'^compare/(\d+)/(\d+)/$', 'my.compareview'),
)

还有这个视图:

def compareview(request, id1, id2):
    # in_bulk returns a dict:  obj_id1: <MyModel instance>, 
    #                           obj_id2: <MyModel instance> 
    # the SQL pulls all at once, rather than sequentially... arguably
    # better than async as it pulls in one DB hit, rather than two
    # happening at the same time
    comparables = MyModel.objects.in_bulk([id1, id2])
    o1, o2 = (comparables.get(id1), comparables.get(id2))      

【讨论】:

in_bulk 是使用线程并行发出查询,还是仍然序列化?我希望最大限度地减少页面呈现延迟。 批量写入单个 SQL 查询,因此没有任何内容被序列化或并行...只有一个数据库命中可以获取两个实例。 恐怕我不能同意,笨蛋。考虑到网络延迟,与一次发送所有信息相比,必须通过 DB 连接分别传输 N 个响应很少会更快。使用一个查询可以让数据库优化整体执行的工作,除非您涉及大量连接或函数,而您的问题没有。就 S.Lott 而言,您确定获取 2 个对象真的是您应用程序的瓶颈吗?甚至是10个?如果是这样,Django(或任何 ORM)可能不适合你……如果你关心微观层面的查询,ORM 往往会很健谈。 N 个并发查询相互竞争。你有有限的连接、有限的语句缓存、有限的数据缓存和对底层文件的有限访问。获取多行的单个查询将(可能)获取单个资源实例,而不会与另一个类似查询竞争。 这很好。如果您确实有一个可以(并且需要)大规模并行化应用程序和数据库的基础架构,那么您会更关心异步性。我想这完全取决于您的应用程序。 Django 的扩展性很好,所以我从不担心这方面的性能,而是依靠代码级别之外的策略和库来分配工作。

以上是关于异步 Django 模型查询是不是可行?的主要内容,如果未能解决你的问题,请参考以下文章

graphene-django:查询所有模型字段而不是请求的字段

Django1.9:没有模型匹配给定的查询

将 Django 模型中的保存方法覆盖为使用 celery 异步的最佳实践

Django-filter:按模型属性过滤

使用 YOLO4 模型在 Android 上运行对象检测是不是可行?

根据来自另一个模型的异步查询在模型中设置虚拟字段