2009-05-27 15 views
20

Django yeniyim ama aklınızda olan uygulama şuna benzer URL'leri sahip sonunda olabilir:Asenkron Django modeli sorguları mümkün mü?

"değiştirinID_1" ve "ID_2" iki farklı model nesnelerin tanımlayıcılardır
http://mysite/compare/id_1/id_2 

. "Karşılaştırma" işleyicisinde Eşzamansız olarak ve paralel olarak, id_1 ve id_2 nesnelerini sorgulamak ve almak istiyorum.

Bunu standart Django sözdizimini kullanarak yapmanın bir yolu var mı? Böyle bir şey görünümlü biter pseudocode için umut ediyorum:

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... 
+1

+1: İlginç bir soru :-) her şey önbelleğe olduğundan, şüphe –

+0

göreceğiniz Bu tür şeylerden herhangi bir kazanç. Nesneniz uygulamanızın gerçekten en yavaş kısmını mı getiriyor? –

+0

Her şey önbelleğe alınmayacak ve bu aslında düşündüğüm gerçek tasarımın basit bir sürümüdür. Forum yazılımı için "bu konudaki tüm mesajları getir" gibi bir şey düşünün. Gönderi sayısı çok büyük olabilir (1000'ler) ve erişim şekli tüm önbelleğe alınamayacak şekilde olabilir. – slacy

cevap

11

Orada Tanımladığınız gibi kesinlikle asenkron işlemleri değildir, ama Django'nın in_bulk sorgu operatörünü kullanarak aynı etkiyi elde edebilirsiniz düşünüyorum, sorgulamak için kimliklerin bir listesini alır. Görünüm için

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

Ve bu:

urls.py için böyle bir şey

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))  
+0

In_bulk, sorguları paralel olarak yayınlamak için thread'lar kullanıyor mu, yoksa hala serileştiriliyor mu? Sayfa oluşturma gecikmesini en aza indirmeye çalışıyorum. – slacy

+0

Toplu olarak tek bir SQL sorgusu yazıyor, böylece hiçbir şey seri hale getirilmiyor ya da paralel olarak ... her iki örneği de alan tek bir DB vuruşu var. –

+0

Bu talihsiz bir şey. Hızlı bir veritabanında, N nesnelerini, tüm nesneler için dev bir tane vermek yerine paralel olarak vermek daha hızlı olacaktır. in_bulk(), gecikmeyi biraz azaltacaktır. Bir O (1) sayfa oluşturmayı umuyorum. – slacy