2009-05-27 12 views
20

Jestem nowy w Django, ale wniosek, że mam na myśli może skończyć się o adresy URL, które wyglądają tak:Czy możliwe są asynchroniczne zapytania modelu Django?

http://mysite/compare/id_1/id_2 

Gdzie „ID_1” i „ID_2” są identyfikatory z dwóch odrębnych obiektów modelu. W procedurze obsługi "porównania" chciałbym asynchronicznie i równolegle wyszukiwać i pobierać obiekty id_1 i id_2.

Czy można to zrobić za pomocą standardowej składni Django? Mam nadzieję, że dla Pseudokod kończy się szuka czegoś takiego:

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: Interesujące pytanie :-) –

+0

Ponieważ wszystko jest buforowane, wątpię, by zobaczyć Cię wszelkie zyski z tego rodzaju rzeczy. Czy twój obiekt pobiera naprawdę najwolniejszą część twojej aplikacji? –

+0

Wszystko nie zostanie zbuforowane, a jest to po prostu prosta wersja rzeczywistego projektu, który rozważam. Wyobraź sobie coś w stylu "pobierz wszystkie posty w tym wątku" na forum. Liczba postów może być bardzo duża (1000), a wzorzec dostępu może być taki, że nie wszystkie są buforowane. – slacy

Odpowiedz

11

Nie ma ściśle asynchroniczne operacje jak opisałeś, ale myślę, że można osiągnąć ten sam efekt przy użyciu Django in_bulk operatora zapytania, która pobiera listę identyfikatorów do zapytania.

Coś takiego na urls.py:

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

A to za widok:

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

Czy in_bulk używa wątków do równoczesnego wysyłania zapytań lub czy są one nadal serializowane? Szukam minimalizacji opóźnień renderowania strony. – slacy

+0

Masowo zapisuje pojedynczą kwerendę SQL, więc nic nie jest szeregowane ani równoległe ... istnieje tylko jedno trafienie bazy danych, które pobiera obie instancje. –

+0

To niefortunne. W szybkiej bazie danych prawdopodobnie szybciej będzie wydać N zapytań równolegle, niż wydać jedną gigantyczną dla wszystkich obiektów. in_bulk() nieco zmniejszy opóźnienie. Mam nadzieję na renderowanie strony O (1). – slacy

Powiązane problemy