When using threads, you must make your code thread-safe. This can be done by either locking (mutexes) all data shared between threads, or by only using immutable data structures. Ruby core classes like String
or Array
are not immutable.
There are several gems providing thread-safe collection classes in Ruby.
concurrent-ruby
The
concurrent-ruby
Show archive.org snapshot
gem provides thread-safe versions of Array
and Hash
:
sa = Concurrent::Array.new # supports standard Array.new forms
sh = Concurrent::Hash.new # supports standard Hash.new forms
There's also a Concurrent::Cache
class that sort of behaves like an unordered Hash
, but is much faster.
Info
If you're using Rails you already have concurrent-ruby in your bundle.
hamster
hamster
Show archive.org snapshot
provides several collection classes, such as Hamster::Hash
.
Hamster collections are immutable. Whenever you modify a Hamster collection, the original is preserved and a modified copy is returned. This makes them inherently thread-safe and shareable. At the same time, they remain CPU and memory-efficient by sharing between copies.