8

いくつかのことを明確にしたいだけです。

Djangoサーバーは非同期で動作すると思いますが(クライアントからのすべてのリクエストがサーバーをブロックすると動作しないため)、DjangoORMが非同期ではないことも知っています。では、データベースへのクエリはサーバーをブロックしますか?(つまり、クエリが完了するまでRESTリクエストが待機しているということですか?)または、まったく異なる動作をして、誤解した可能性があります。

ほとんどのORMがブロックしていると聞いたので、これを求めています。したがって、ツイストサーバーでそれらを使用してツイストをブロックせずにdbからデータを取得することはできません。

4

2 に答える 2

9

サーバーが非同期で動作する必要があるのはなぜですか? Django は WSGI アプリケーションです。同時実行モデルは、それを実行するサーバーに依存し、スレッド化、マルチプロセッシング、非同期 (選択ループ駆動)、またはそれらの組み合わせにすることができます。

各 Django リクエスト自体は完全に同期しています。データベースにクエリを実行すると、結果が返されるまでリクエストがブロックされます。他の同時リクエストを認識する必要はありません (Django がスレッドセーフな方法でデータ構造を処理することを保証する以外は)。

于 2013-02-12T10:03:09.930 に答える
0

あなたが抱えているように見えるのと同じような問題に直面しています。私の django アプリケーションは、ビューをレンダリングするために残りのサービスへの多くの呼び出しを実行します。私はこれを開発しました:

https://github.com/kowalski/featdjango/

これはツイスト Web に基づくアプリケーション サーバーです。django-on-twisted プロジェクトとは異なり、wsgi をまったく使用しません。Django コードはスレッドで実行されます。それらのプールがあります。Twisted コードはメイン アプリケーション スレッドで実行され、プールを管理します。Django コードからいくつかの呼び出しを行う必要があり、それを同時に行うことでメリットが得られる場合は、Deferred (または DeferredList) を返すメソッドを作成する必要があります。それよりも、django コードから、次の方法で呼び出すことができます。

import threading
...

ct = threading.current_thread()
result = ct.wait_for_defer(method_to_call, *args, **kwargs)

これには、reactor.callFromThread() メソッドで *method_to_call* を呼び出し、コールバックをバインドして呼び出し元スレッドを起動する効果があります。Deferred の結果が返されるか、例外が発生します (errback() が起動された場合)。

于 2013-02-12T11:03:43.497 に答える