Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/joekain/BlockingQueue

A blocking queue written in Elixir.
https://github.com/joekain/BlockingQueue

Last synced: about 1 month ago
JSON representation

A blocking queue written in Elixir.

Awesome Lists containing this project

README

        

BlockingQueue
=============

[![Build Status](https://semaphoreci.com/api/v1/projects/019de5e9-689e-4c1c-b5ba-3242e44ab483/455080/badge.svg)](https://semaphoreci.com/joekain/blockingqueue) [![Inline docs](http://inch-ci.org/github/joekain/BlockingQueue.svg?branch=master)](http://inch-ci.org/github/joekain/BlockingQueue)

BlockingQueue is a simple queue implemented as a GenServer. It has a fixed
maximum length established when it is created.

The queue is designed to decouple, but limit, the latency between a producer and
consumer. When pushing to a full queue the `push` operation blocks
preventing the producer from making progress until the consumer catches up.
Likewise, when calling `pop` on an empty queue the call blocks until there
is work to do.

## Installation

Add a dependency in your mix.exs:

```elixir
deps: [{:blocking_queue, "~> 1.0"}]
```

## Examples

A simple example:

```elixir
{:ok, pid} = BlockingQueue.start_link(5)
BlockingQueue.push(pid, "Hi")
BlockingQueue.pop(pid) # should return "Hi"
```

The queue is designed to be used from more complex examples in which the
producer and consumer are in separate processes and run asynchronously to each
other.

An example of an infinite stream:
```elixir
{:ok, pid} = BlockingQueue.start_link(:infinity)
BlockingQueue.push(pid, "Hi")
BlockingQueue.pop(pid) # should return "Hi"
```

An example using the `Stream` API

```elixir
{:ok, pid} = BlockingQueue.start_link(5)

[1, 2, 3]
|> BlockingQueue.push_stream(pid)

BlockingQueue.pop_stream(pid)
|> Enum.take(3) # Should return [1, 2, 3]
```

## Contribute

Just fork the repo, make your change, and send me a pull request.

Or, feel free to file and issue and start a discussion about a new feature you have in mind.