# fastq  [![build status](https://secure.travis-ci.org/mcollina/fastq.png)](http://travis-ci.org/mcollina/fastq) Fast, in memory work queue. `fastq` is API compatible with [`async.queue`](https://github.com/caolan/async#queueworker-concurrency) Benchmarks (1 million tasks): * setImmediate: 1359ms * fastq: 1492ms * async.queue: 4039ms * neoAsync.queue: 4476ms Obtained on node 4.2.2, on a MacBook Pro 2014 (i7, 16GB of RAM). If you need zero-overhead series function call, check out [fastseries](http://npm.im/fastseries). For zero-overhead parallel function call, check out [fastparallel](http://npm.im/fastparallel). [![js-standard-style](https://raw.githubusercontent.com/feross/standard/master/badge.png)](https://github.com/feross/standard) * Installation * Basic Example * API * Licence & copyright ## Install `npm i fastq --save` ## Usage ```js 'use strict' var queue = require('fastq')(worker, 1) queue.push(42, function (err, result) { if (err) { throw err } console.log('the result is', result) }) function worker (arg, cb) { cb(null, 42 * 2) } ``` ### Setting this ```js 'use strict' var that = { hello: 'world' } var queue = require('fastq')(that, worker, 1) queue.push(42, function (err, result) { if (err) { throw err } console.log(this) console.log('the result is', result) }) function worker (arg, cb) { console.log(this) cb(null, 42 * 2) } ``` ## API * fastqueue() * queue#push() * queue#unshift() * queue#pause() * queue#resume() * queue#idle() * queue#length() * queue#kill() * queue#killAndDrain() * queue#concurrency * queue#drain * queue#empty * queue#saturated ------------------------------------------------------- ### fastqueue([that], worker, concurrency) Creates a new queue. Arguments: * `that`, optional context of the `worker` function. * `worker`, worker function, it would be called with `that` as `this`, if that is specified. * `concurrency`, number of concurrent tasks that could be executed in parallel. ------------------------------------------------------- ### queue.push(task, done) Add a task at the end of the queue. `done(err, result)` will be called when the task was processed. ------------------------------------------------------- ### queue.unshift(task, done) Add a task at the beginning of the queue. `done(err, result)` will be called when the task was processed. ------------------------------------------------------- ### queue.pause() Pause the processing of tasks. Currently worked tasks are not stopped. ------------------------------------------------------- ### queue.resume() Resume the processing of tasks. ------------------------------------------------------- ### queue.idle() Returns `false` if there are tasks being processed or waiting to be processed. `true` otherwise. ------------------------------------------------------- ### queue.length() Returns the number of tasks waiting to be processed (in the queue). ------------------------------------------------------- ### queue.kill() Removes all tasks waiting to be processed, and reset `drain` to an empty function. ------------------------------------------------------- ### queue.killAndDrain() Same than `kill` but the `drain` function will be called before reset to empty. ------------------------------------------------------- ### queue.concurrency Property that returns the number of concurrent tasks that could be executed in parallel. It can be altered at runtime. ------------------------------------------------------- ### queue.drain Function that will be called when the last item from the queue has been processed by a worker. It can be altered at runtime. ------------------------------------------------------- ### queue.empty Function that will be called when the last item from the queue has been assigned to a worker. It can be altered at runtime. ------------------------------------------------------- ### queue.saturated Function that will be called when the queue hits the concurrency limit. It can be altered at runtime. ## License ISC