Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Like alias_method, but it's lock_method! (lockfiles)
Ruby

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
test
.gitignore
Gemfile
README.rdoc
Rakefile
lock_method.gemspec

README.rdoc

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 carbon.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 hash
    url.hash
  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.clear_method_lock :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 #hash

If you want to lock instance methods, you should define #hash on those instances.

You should follow Ruby convention and have #hash return a Fixnum.

Ideally, you should try to make a String or a Hash and call the standard #hash on that.

Note: this is NOT the same thing as #to_hash! That returns a Hash… but what we want is an integer “hash code.”

Defining #method_lock_hash instead of #hash

If you don't want to modify #hash, you can use #method_lock_hash instead.

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

Something went wrong with that request. Please try again.