lock_method
It’s like alias_method
, but it’s lock_method
!
Lets you lock a method so that only one process can call it at a time. Defaults to using lockfiles on the local file system, but can be configured to store the locks in Memcached or Redis, allowing the method locks to hold over multiple hosts.
Real-world usage
In production use at impact.brighterplanet.com and data.brighterplanet.com.
Example
require 'lock_method'
class Blog
attr_accessor :url
def get_latest_entries
sleep 5
end
lock_method :get_latest_entries
# used by lock_method to differentiate between instances
def as_lock
url
end
end
Then you can do
my_blog.get_latest_entries => it will start...
my_blog.get_latest_entries => this will raise LockMethod::Locked if you try to run it before the other call finishes
Just in case, you can clear them
my_blog.lock_method_clear :get_latest_entries
Pays attention to method arguments
If you lock Foo.bar(*args), calling Foo.bar(:baz) will not lock out Foo.bar(:zoo).
Defining #as_lock
If you want to lock instance methods, you should define #as_lock
on those instances.
Locking across hosts
If you want to lock across hosts, just use shared storage, like a remote Redis or memcached instance.
If you want to lock locally, but you’re using shared storage, just get the hostname of the locking instance into the as_lock
.
Configuration (and supported cache clients)
The default is to use filesystem lockfiles, usually in /tmp/lock_method/*
.
If you want to share locks among various machines, you can use a Memcached or Redis client:
LockMethod.config.storage = Memcached.new '127.0.0.1:11211'
or
LockMethod.config.storage = Redis.new
or this might even work…
LockMethod.config.storage = Rails.cache
See Config for the full list of supported caches.
Copyright
Copyright 2011 Seamus Abshere