Wie kann ich mit File # flock eine nicht blockierende Anfrage für eine exklusive Sperre stellen?

Wie soll ich eine nicht blockierende Sperre anfordern?

Warum nicht RubysDatei # Herde funktionieren wie erwartet, wenn separate Versuche unternommen werden, eine Datei zu sperren? Das Sperren der Datei in einem Block ist nicht die richtige Lösung für dieses Problem, da das Sperrverhalten angezeigt werden sollhartnäckig Schlösser. Wenn Sie File # flock in einem Block verwenden, wird die Sperre beim Beenden des Blocks aufgehoben, sodass das Problem nicht richtig dargestellt wird.

File # flock schlägt auf verschiedene Arten fehl, insbesondere wenn eine nicht blockierende Sperre angefordert wird. Es folgen einige Beispiele.

Fehlgeschlagene Beispiele mit der Datei # flock

Unbegrenztes Warten bei Verwendung mehrerer exklusiver Sperren, da #flock keine Möglichkeit zum Timeout einer Sperranforderung bietet.

# First lock succeeds.
f1 = File.open('foo', File::RDWR|File::CREAT, 0644)
f1.flock(File::LOCK_EX)
# => 0

# This never returns.
f2 = File.open('foo', File::RDWR|File::CREAT, 0644)
f2.flock(File::LOCK_EX)

Das Anfordern einer nicht blockierenden Sperre, während die Datei exklusiv gesperrt ist, führt zu einer ungültigen Argumentausnahme.

f1 = File.open('foo', File::RDWR|File::CREAT, 0644)
f1.flock(File::LOCK_EX)
# => 0

f2 = File.open('foo', File::RDWR|File::CREAT, 0644)
f2.flock(File::LOCK_NB)
# => Errno::EINVAL: Invalid argument - foo

Die Dokumentation besagt, dass #flock "Sperrt oder entsperrt eine Datei gemäß locking_constant (eine logische oder der Werte in der folgenden Tabelle)." Ein logisches ODER wird jedoch ausgelöstErrno::EINVAL oderErrno::EBADF je nach Plattform.

f1 = File.open('foo', File::RDWR|File::CREAT, 0644)
f1.flock(File::LOCK_EX)
# => 0

f2 = File.open('foo', File::RDWR|File::CREAT, 0644)
f2.flock(File::LOCK_NB || File::LOCK_EX)
# => Errno::EINVAL: Invalid argument - foo
Native File # Flock Solution Bevorzugt

Während man das benutzen könnteTimeout-Modul zu erhöhenTimeout::Error Wenn es nicht möglich ist, eine exklusive Sperre zu erhalten, sollte File # flock dieses Problem anscheinend von Haus aus lösen können. Also, wie soll man eigentlich eine exklusive Sperre anfordern, ohne zu blockieren?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage