npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ch

v0.3.0

Published

A simple approach to handling resource concurrency limits within a single system thread.

Downloads

227

Readme

What is the concurrency handler?

This is a simple approach to handling resource concurrency limits within a single system thread. Most commonly this would be used with network sockets and file descriptors.

Goals

  1. Keep a FIFO queue of requested calls
  2. Enforce a max number of calls being executed concurrently within the entire thread
  3. If the concurrency limit is raised, immediately run more operations (if lowered, allow current operations to complete)
  4. Provide flexible callback options (curry into callback, pass-through arguments, etc.)

Minimal Use Example

This is about the most simplistic use-case you could have:

var ch = require( 'ch' ).ch;

function myFirstFunction( callback ) {
    setTimeout( function() {
        callback();
    } , 1000 );
}

function mySecondFunction( callback ) {
    callback(); // Immediately finished
}

ch.queue({ callback: myFirstFunction });
ch.queue({ callback: mySecondFunction });
...

The above will not run mySecondFunction until myFirstFunction finishes after one second.

API

First, you have to import the library.

var ch = require( 'ch' ).ch;

You may optionally set the maximum number of concurrent operations per category (if no category is specified, the current default category will be used). By default the maximum number of concurrent operations per category is one, to be safe. You'll probably want to increase this.

ch.setMax( [category] , amount );

You may manually specify the default category, which will be used going forward until you manually change it again. If no default category is specified, then the first category specified is the default (and if the first call which can take a category has no category specified, then an empty string is used).

ch.setDefaultCategory( category );

You may set any defaults for a category except for the category (as that is set by the preceeding method). These will be used if the corresponding value is not set on an individual queue operation.

ch.setCategoryDefaults({
    amount: 1,
    curryRelease: false,
    debug: false,
    arguments: null,
});

At any point while running, you can get the max resources available for a category (e.g. 1024 concurrent file descriptors), how many operations are consuming descriptors, and how may remain.

ch.getMax( [category] );
ch.getRunning( [category] );
ch.getFree( [category] );

The most oft-used operation will be the queue() call. This call will wait to run the passed callback until enough resources from that category are available. For example, if you know you're going to need three file descriptors, you might set category to 'fd' and amount to 3. If the resources are immediately available, the callback will be run inline (not deferred).

release = ch.queue({
    callback: function,
    [context: object],
    [curryRelease: boolean],
    [arguments: array],
    [category: category],
    [amount: number],
    [debug: boolean],
    [unshift: boolean],
});

The release method is used to indicate when the callback no longer requires its resources (release the resources back into the wild). It is returned from the queue() call, but can also be curried onto the front of the callback argument list with the curryRelease option.

release();

If debugging is enabled (by default or for a particular call), additional information can be found on the "debug" property of the release method.

console.log( release.debug ); // Only if debug was set true