2009-05-27 9 views
20

私はジャンゴに新しいんだけど、私が考えているアプリケーションは、このように見えるURLを持つに終わるかもしれない:非同期Djangoモデルクエリは可能ですか?

「ID_1」および「ID_2」とは、2つの異なるモデルオブジェクトの識別子です
http://mysite/compare/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... 
+1

1: –

+0

:-)興味深い質問すべてがキャッシュされているので、私はあなたが見たい疑いますこの種のものからの利益。オブジェクトが実際にアプリケーションの最も遅い部分をフェッチしていますか? –

+0

すべてはキャッシュされません。これは実際に私が検討している実際のデザインの単純なバージョンです。フォーラムソフトウェアの "このスレッドのすべての投稿を取得する"のようなものを想像してみてください。投稿の数は非常に多く(1000年)、アクセスパターンはすべてキャッシュされていない可能性があります。 – slacy

答えて

11

あり、あなたが説明してきたように厳密に非同期操作はありませんが、私はあなたが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))  
+0

in_bulkは、スレッドを並行して発行するためにスレッドを使用しますか、それともまだシリアル化されていますか?私は、ページレンダリングの待ち時間を最小限に抑えることを考えています – slacy

+0

バルクでは1つのSQLクエリを書くので、何もシリアル化されていないか、パラレルにはありません。両方のインスタンスを取得するDBヒットは1つだけです。 –

+0

これは残念です。高速なデータベースでは、すべてのオブジェクトに対して1つの巨大なクエリを発行するよりも、N個のクエリを並列で発行するほうが高速になる可能性があります。 in_bulk()は待ち時間をわずかに減らします。私はO(1)ページのレンダリングを望んでいます。 – slacy

関連する問題