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

sla*_*acy 23 python mysql django multithreading django-models

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

http://mysite/compare/id_1/id_2
Run Code Online (Sandbox Code Playgroud)

其中"id_1"和"id_2"是两个不同的Model对象的标识符.在"比较"的处理程序中,我想异步,并行地查询和检索对象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...
Run Code Online (Sandbox Code Playgroud)

Jar*_*die 11

没有像你所描述的那样严格的异步操作,但我认为你可以通过使用django的in_bulk查询运算符来实现相同的效果,该运算符需要一个id列表来查询.

对于这样的事情urls.py:

urlpatterns = patterns('',
    (r'^compare/(\d+)/(\d+)/$', 'my.compareview'),
)
Run Code Online (Sandbox Code Playgroud)

这对于观点:

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))      
Run Code Online (Sandbox Code Playgroud)

  • 我害怕我不能同意,懈怠.必须通过数据库连接分别传输N个响应,考虑网络延迟,而不是一次性发送所有信息的响应,很快就会更快.使用一个查询可以让数据库优化整体执行的工作,除非您涉及大量的连接或函数,而您的问题却没有.对于S.Lott来说,你确定获取2个对象真的是你应用程序的瓶颈吗?甚至拿10?如果是这样,Django(或任何ORM)可能不适合您...如果您关注微观层面的查询,ORM往往会很健谈. (4认同)
  • N个并发查询相互竞争.您具有有限的连接,有限的语句缓存,有限的数据缓存以及对底层文件的有限访问.获取多行的单个查询将(可能)获取单个资源实例,而不会与另一个类似查询竞争. (4认同)