WindUp
WindUp allows you to do super simple background processing using Celluloid Actors.
Installation
# Gemspec
gem 'wind_up'
Usage
WindUp's Delegator
allows us to use one queue to process multiple job types.
Delegator#perform_with
will instantiate a class and run its #perform
method, passing any additional arguments provided.
Create a new Delegator
queue using the WindUp Queue method. Use
Delegator#perform_with
to send tasks to this queue. Asynchronous processing
is accomplished the same way you would with a WindUp Queue or Celluloid Pool;
#sync
, #async
, and #future
all continue to work as expected.
# Create a Delegator queue; these are equivalent
queue = WindUp::Delegator.queue size: 3
queue = WindUp.queue size: 3
# Create a job class
class GreetingJob
def perform(name = "Bob")
"Hello, #{name}!"
end
end
# Send the delayed action to the Delegator queue
queue.perform_with GreetingJob, "Hurried Harry" # => "Hello, Hurried Harry!", completed synchronously
queue.async.perform_with GreetingJob, "Mellow Mary" # => nil, work completed in background
queue.future.perform_with GreetingJob, "Telepathic Tim" # => Celluloid::Future, with value "Hello, Telepathic Tim!"
# Store this queue for later usage
Celluloid::Actor[:background] = queue
# Later...
Celluloid::Actor[:background].async.perform_with GreetingJob, "Tina"
Tips
-
Don't share state from your current thread with your Jobs!
With WindUp, your jobs will be eventually processed, but we have no idea how long it'll be. As such, your jobs and messages should not share state. I.e., don't pass a User object; pass a user.id and recreates the user from the database within your job.
-
Use JSON serializable arguments for your jobs
Not only is it a good way to prevent yourself from accidentally sharing state (see previous point), but if you want to use a persistant job store you cannot pass in any objects that can't be dumped to JSON.
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request