GithubHelp home page GithubHelp logo

martinheidegger / flexlock Goto Github PK

View Code? Open in Web Editor NEW
5.0 3.0 1.0 178 KB

A memory-efficient, in-memory, flexible, Promise-based locking library without dependencies.

License: MIT License

JavaScript 100.00%
javascript lock process multithreading mutex mutex-lock mutex-synchronisation

flexlock's Introduction

flexlock

Build Status JavaScript Style Guide Maintainability Test Coverage

flexlock is a small, memory-concious, flexible, Promise-based locking library without dependencies.

npm i flexlock --save

It is similar to other in-memory locking library like mutexify, mutex-js, await-lock, and many more, but with more flexibility in how to use it. This makes it sturdier and more practical in many cases.

simple API when that suffices

const createLock = require('flexlock/createLock') // require('flexlock').createLock works too

const lock = createLock()

lock(async () => {
  // done before the next block
})
lock(async () => {
  // done after the previous block
})

Timeouts in case anther lock never returns

lock(() => new Promise()) // This never releases the lock
lock(async () => {}, 500)
  .catch(err => {
    err.code === 'ETIMEOUT'
  })

Propagation of errors and results

async function business () {
  try {
    const important = await lock(async () => {
      // do your thing
      return important
    })
    // You can use the important data here.
  } catch (err) {
    // Woops, something happened!
  }
}

Dedicated locks for more readable async code

async function business () {
  const unlock = await lock()
  // do your thing
  unlock()
}

release handlers both once and globally

const lock = createLock(() => {
  // called every time the lock is released
})

lock.released(function () {
  // called once, next time the lock is released
})

await lock.released() // Promise API available as well

Namespace support for multiple lockers

const createLocker = require('flexlock/createLocker') // require('flexlock').createLocker works too

const lock = createLocker()

async function business (id, content) {
  await lock(id, async () => {
    // do your thing, locked to this id!
  })
}

Implementation note: The locker will use createLock per id. It will keep the created lock until all locks for that id are released. Then it will pass the lock to the garbage collector.

License

MIT

flexlock's People

Contributors

kesla avatar martinheidegger avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

kesla

flexlock's Issues

Implement multiple locks at the same time.

Right now, require('flexlock/createLocker') only allows a single key to lock towards lock(key, ...) but some code requires multiple resources to work, a new API that works like lock([keyA, keyB], ...) would be good. The obvious implementation would be to just use Promise.all to await three locks, but a more-complex implementation that allows other sublocks to receive early might be not a bad idea. In an example:

  1. (A) lock(['users', 'user:11'], ...) → ... processing
  2. (B) lock(['users', 'user:12'], ...) → ... waiting for (A) to finish
  3. (C) lock('user:12') → processing
  4. (A) finished, (B) → waiting for (C) to finish
  5. (C) finished, (B) → processing
  6. (B) finished

In that example (C) can start processing without waiting for (B) to finish because it only uses part of the resources of (B). This would require a more complicated implementation though.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.