[RAILS] Hinweise zu Rubys Thread # [] = Methode

Über Ruby's Thread # [] = Methode

Mit der Ruby Thread # [] = `Methode können Sie für jeden Thread einen eindeutigen Wert beibehalten. (Es ist wie "ThreadLocal" in Java) Wenn Sie dies verwenden, wird der Anwendungsserver (fast alle AP-Server wie z. B. Passenger), der 1 Thread und 1 Anforderung zugeordnet ist, verwendet Es kann als threadlokale Variable verwendet werden, die geschlossen und nur während einer Anforderung verwendet werden kann.

Beispiel für die Verwendung der Ruby Thread.current [] -Methode

Sie können die threadlokale Variable foo definieren, indem Sie dem aktuellen Thread Thread.current [: foo] wie folgt zuweisen:

def self.foo
  Thread.current[:foo] ||= 0
end

Es gibt auch ein Juwel namens RecordWithOperator, das dem Ruby on Rails-Framework die Möglichkeit bietet, Datensatzoperatoren (Ersteller, Aktualisierer, Löscher) aufzuzeichnen. Es wird mit diesem Thread # [] = implementiert. https://github.com/nay/record_with_operator/blob/4389d077b0303b956cc211ef439a46a216ae2cc0/lib/record_with_operator/operator.rb#L4

Thread # [] = Hinweise zur Methode

Wenn Sie einen Anwendungsserver wie Passenger oder Puma verwenden, der einmal erstellte Threads wiederverwendet Da die lokale Thread-Variable dem Thread zugeordnet ist, der wiederverwendet werden soll, muss sie auf der Anwendungsseite explizit zerstört werden. Bitte beachten Sie, dass auf die in der vorherigen Anforderung (Thread) definierten Variablen in einer anderen Anforderung verwiesen werden kann.

Redmine hatte zuvor auch Code, um den aktuellen Benutzer mit Thread # [] = zu behandeln Es gab einen Fall eines Sicherheitsfehlers, bei dem der Name eines anderen Benutzers in der Fehlermeldung angezeigt wurde. http://www.redmine.org/issues/16685

Lösung

Dies kann vermieden werden, indem der Wert Thread.current auf der Anwendungsseite explizit verworfen wird. Wenn Sie ein Juwel namens RequestStore verwenden, können Sie für jede Anforderung die Ebene Rack :: Middleware verwenden. Der Wert von "Thread.current" wird jetzt gelöscht.

Ein Anwendungsbeispiel lautet wie folgt:

def self.foo
  RequestStore.store[:foo] ||= 0
end

Recommended Posts

Hinweise zu Rubys Thread # [] = Methode
[Ruby] Hinweise zur Methode gets
Ruby to_s Methode
Ruby Hash Notizen
[Ruby] Initialisierungsmethode
Ruby-Build-Methode
Ruby-Accessor-Methode
Ruby Map Methode
Abkürzung für Ruby-Methode
Definition der Rubinmethode
[Ruby] Zusammenfassung der Methodendefinitionen
[Java] Grundlegende Methodenhinweise
Wie man ganze Zahlen mit Rubin überprüft
Ruby-Algorithmus (Injizieren, Methodendefinition)
[Ruby] Methode, die die Wahrheit zurückgibt
[ruby] Eine Methode mit einem Argument aufrufen
[Java] Neue Thread-Generierungsmethode (1)
Entwurfsmuster nach Ruby Template-Methode Musternotiz
[Ruby] Methode zum Zählen bestimmter Zeichen
[Ruby-Grundlagen] Split-Methode und to_s-Methode
[Ruby on Rails] Praktische Hilfsmethode
Verwendung der Ruby-Inject-Methode
Ruby on Rails-Installationsmethode [Mac Edition]
Implementierte "Floyd Circulation Detection Method" in Ruby
Ruby print setzt die Ausgabemethode p printf
Hinweise zur Verwendung von FCM mit Ruby on Rails
[Ruby / Rails] Mechanismus zum erneuten Versuch eines Thread-Fehlers
Extrahieren Sie Zeichen aus der Ruby-String-Slice-Methode