Thread-Sicherheit mit Vorlagen-Tags

8

Nach dem Lesen von dieses Dokument über die Thread-Sicherheit, Ich habe das Gefühl, dass etwas in der Dokumentation fehlt oder dass ich es lese oder meine Argumentation.

Lassen Sie uns ein einfaches Beispiel geben:

%Vor%

Ich habe diesen Code verstanden, um eine neue Instanz der Klasse HelloWorldNode zu erstellen, wenn das hello_world -Tag verwendet wird. Andere Beispiele beinhalten das Übergeben von Argumenten an den Konstruktor, wie folgt:

%Vor%

Wenn also hello_world ausgeführt wird, wird eine neue Instanz von HelloWorldNode erstellt und das Instanzwörterbuch hat das Attribut message . Diese Instanz muss sicher nur für das Rendern nur der gegebenen Instanz des Tags verwendet werden, da die Verwendung für andere Renderings bedeuten würde, dass die an sie gebundenen Daten falsch wären. Wenn dies nicht der Fall wäre, würden die Argumente zwischen verschiedenen Verwendungen des Tags durcheinander kommen.

Wenn Sie sich andere Beispiele aus der Dokumentation ansehen, finden Sie hier ein vereinfachtes Beispiel aus hier :

%Vor%

Da dies Daten von den Token übernimmt, die an die Funktion übergeben werden, kann CurrentTimeNode nur funktionieren, wenn jedes Mal, wenn do_current_time aufgerufen wird, eine neue Instanz instanziiert wird.

Zurück zur Dokumentationsseite, wo die Dissonanz einsetzt. Das ist "schlecht".

%Vor%

Das Dokument sagt, dass zwei Seiten, die das gleiche Tag verwenden, möglicherweise Race-Bedingungen erfahren, wenn beide denselben Knoten verwenden. Ich verstehe nicht, wie das Rendern von zwei Vorlagen dazu führen könnte, dieselbe Instanz zu teilen, wenn beide ihre eigenen Instanzen instanziieren.

Der Weg, um dies zu lösen, sagt die Dokumentation ist wie folgt:

%Vor%

Dies scheint context.render_context mit self zu indizieren. Die Implikation davon muss sein, dass self verwendet wird, um die Instanz auf eine von zwei Arten zu identifizieren:

  1. self verweist auf eine bestimmte Instanz der Klasse im gesamten System
  2. self verweist nur auf diese Klasse, und um auf die Instanz verweisen zu können, ist ein Render-Kontext erforderlich

Wenn 1 zutrifft, verknüpfen Sie die Daten einfach mit self ?

Wenn 2 wahr ist und der Render-Kontext "mit dem Kontext der Vorlage verknüpft ist, die gerade gerendert wird", wie ist es dann möglich, zwischen zwei Instanzen des Template-Tags auf derselben Seite zu unterscheiden?

Wird der Knoten bei jedem Aufruf des Tags einzeln instanziiert? Wenn ja, warum die Nebenläufigkeitsprobleme? Wenn nicht, warum nicht?

    
Joe 20.09.2011, 10:11
quelle

1 Antwort

0

Bei näherer Lektüre von das .

Die Vorlage wird beim Laden kompiliert. Alle Argumente, die an die Tag-Funktion übergeben werden, sind 'statisch'. Sie sind entweder Literalzeichenfolgen oder Zeichenfolgen, die als Bezeichner verwendet werden, um gebundene Variablen im Renderkontext nachzuschlagen.

Daher wird das Node-Objekt für jedes Tag instanziiert und ist immer einsatzbereit, wenn das Template verwendet wird (und natürlich kann das Template in einer beliebigen Anzahl von Threads verwendet werden).

Also ist der self in meiner Frage die Identität des spezifischen Knotens innerhalb der Vorlage. Zusammen mit dem Renderkontext ergibt dies eine eindeutige Identität, an der Instanzvariablen hängen.

    
Joe 20.09.2011, 12:37
quelle