2009-05-27 13 views
20

Sono nuovo di Django, ma l'applicazione che ho in mente potrebbe finire per avere gli URL che assomigliano a questo:Le query di modello Django asincrono sono possibili?

http://mysite/compare/id_1/id_2 

Dove "ID_1" e "ID_2" sono identificatori di due oggetti del modello distinti. Nel gestore di "compare" mi piacerebbe in modo asincrono e, in parallelo, interrogare e recuperare gli oggetti id_1 e id_2.

C'è un modo per farlo utilizzando una sintassi standard di Django? Spero in pseudocodice che finisce per guardare qualcosa di simile:

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: Domanda interessante :-) –

+0

Dal momento che tutto è memorizzato nella cache, dubito che ci si vede qualsiasi guadagno da questo genere di cose. I tuoi oggetti sono davvero la parte più lenta della tua applicazione? –

+0

Tutto non verrà memorizzato nella cache, e questa è in realtà solo una semplice versione del progetto attuale che sto considerando. Immagina qualcosa come "scarica tutti i post in questo thread" per il software del forum. Il numero di post potrebbe essere molto grande (1000) e il modello di accesso potrebbe essere tale da non essere tutti memorizzati nella cache. – slacy

risposta

11

Non ci sono operazioni rigorosamente asincrone come hai descritto, ma penso che si può ottenere lo stesso effetto utilizzando in_bulk operatore di query di Django, che prende una lista di ID da interrogare.

qualcosa di simile per la urls.py:

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

E questo per la vista:

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 utilizza i thread per emettere le query in parallelo o sono ancora serializzate? Sto cercando di ridurre al minimo la latenza del rendering delle pagine. – slacy

+0

In bulk scrive una singola query SQL, quindi niente è serializzato o in parallelo ... c'è solo un singolo hit DB che recupera entrambe le istanze. –

+0

Questo è un peccato. Su un database veloce, è probabile che sia più veloce emettere N query in parallelo piuttosto che emetterne uno gigante per tutti gli oggetti. in_bulk() ridurrà leggermente la latenza. Sto sperando in un rendering di una pagina O (1). – slacy

Problemi correlati