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.
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
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
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