README.rdoc
March 1, 2012 ยท View on GitHub
= 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}[http://impact.brighterplanet.com] and {data.brighterplanet.com}[http://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