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