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)
```