2017-03-05 2 views
0

最初に 'はい'で始まり、このトピックをチェックして調べましたが、私の質問に明確な答えが得られるものは何も見つかりませんでしたか?私はDjagnoの初心者で、テンプレートのタグのレンダリング方法についてのスレッドの安全性の考慮についてのドキュメントを勉強しています。ここには、文書Linkへのリンクがあります。私の質問には、が記載されています。ノードが解析されると、そのノードのレンダリングメソッドが複数回呼び出される可能性があります同じ文書内のテンプレートタグの使用について、サーバ上のユーザのシングルインスタンスレベルでまたは世界中のすべてのユーザから複数の要求にテンプレートタグを使用すると、メモリ内の同じdjangoインスタンスを共有していますか?その後者の場合、新しいユーザーリクエストごとにサーバーレベルで新しいインスタンスを作成し、メモリ内のすべてのユーザーに別々のリソースを割り当てるか、これについて間違っていますか?Djangoスレッディング構造

答えて

0

後者です。

通常、WSGIサーバーは多くの永続プロセスを実行し、各プロセスでは多数のスレッドを実行します。いくつかの自動スケーリングを適用することができますが、プロセスとスレッドの数はほぼ一定であり、Djangoが処理できる並行要求の数を決定します。各リクエストが新しいCGIプロセスを作成する時代はもうなくなり、ほとんどの場合、永続プロセスがはるかに効率的です。

各プロセスには独自のメモリがあり、プロセス間の通信は通常データベースやキャッシュなどで処理されます。メモリを介して直接通信することはできません。

プロセス内の各スレッドは同じメモリを共有します。これは、局所スコープでない(例えば、関数内でのみ定義された)オブジェクトは、他のスレッドからアクセス可能であることを意味する。キャッシュされたテンプレートローダーは、各テンプレートをプロセスごとに1回解析し、各スレッドは同じ解析済みノードを使用します。これは、たとえば、 self.foo = 'bar'を1つのスレッドに入れると、self.fooにアクセスすると、各スレッドは'bar'を読み込みます。同時に複数のスレッドが実行されるので、これはすぐにデバッグすることが不可能な大きな混乱になり、スレッドの安全性が非常に重要になります。

ドキュメントには、selfにデータを保存していないが、context.render_contextにデータを保存していれば、問題ありません。

+0

まずは** Thanks Man **。あなたの答えからの私の認識がここにあります。基本的に、サーバーはすべての着信要求に対して1つのプロセスを作成し、プロセスのグローバルリソースを共有するいくつかの固定数のスレッドが維持されます。だから**スレッドセーフティが必要です**。 –

+0

かなり、はい。ビジー状態のサイトがある場合は、複数のスレッドを持つ複数のプロセスを使用しますが、それ以外のスレッドは存在しません。 – knbk

関連する問題