README.md

Exeque
======

Queue up a list of functions and specify how many workers should be used to run those functions.

## Motivation

I've had  cases where I had a list of a few hundred independent long running operations
that needed to happen.  In each of the cases, the operations couldn't all happen at once since they
depended on a finite set of resources.  Having 8 or so of them happen at once though can be a
significant performance boost.


## Installation / Dependency

Add exeque to your `mix.exs` dependencies with whatever version you'd like to depend on:

```elixir
def deps do
  [ {:exeque, "~> x.y.z"} ]
end
```


## Usage

You specify the queue name, the list of functions that need to be run, and how many workers you'd
like to be running at once to empty the queue.

``` elixir
def eggcellent(multiplier \\ 1) do
  sleep_time = 200 * multiplier
  IO.puts "Started - #{sleep_time} ms"
  :timer.sleep(sleep_time)
  IO.puts "Finished - #{sleep_time} ms"
end

jobs = [
  fn -> eggcellent    end,
  fn -> eggcellent(8) end,
  fn -> eggcellent(3) end,
  fn -> eggcellent    end,
  fn -> eggcellent(4) end,
  fn -> eggcellent    end,
  fn -> eggcellent    end,
]

Exeque.create_queue(:egg_queue)
Exeque.enque(:egg_queue, jobs)
Exeque.process(:egg_queue, 3)
```

The worker processes are created when you call `process/2`.  The function blocks until the
queue is empty.

You can also do it all in one function if you'd like:

``` elixir
Exeque.create_enque_and_process("queue_name", jobs, 8)
```