nodejs中的锁——async-lock解析

概数

async-lock的npm地址

https://www.npmjs.com/package…

为什么是async-lock?

因为我见其下载量比较大(在我发现的所有类似库中是最大的)且最近更新时间较近。

场景

  1. 在异步函数中,由于存在异步操作,对此函数的A,B两次执行会出现结束次序不可控。即A先执行,却比B后退出函数。
  2. 对于数据库的操作,有时会将select的值进行一系列业务变化后重新update至数据库。就比如简单的计数器,0开始计数,假设由于业务原因,
    必须在代码中进行+1操作。则A读取数据库进入异步执行,此时B也开始执行读取数据库的代码,最终后造成两次执行后计数器只加了1。

此时便需要锁机制,类似于Java中的synchronized或者lock。执行同一段代码时,添加相同的key,则发现此key正在使用,则直接放入此key的待执行数组。

async-lock原理

AsyncLock类:

  • queues:用于存储所有的待执行函数,格式为:{key: [function, function]}
  • acquire(key, fn):

    • key:需要上锁的名称,即queues中的key
    • fn:为需要执行的函数。操作即将fn添加到queues[key]对应的数组中。若queues无此key字段,则将起值置[]后直接执行。

当key对应函数执行完毕后,会检查queues中对应key值数组是否为空,为空则执行delete queues[key],否则继续执行下一个待执行函数。

其余使用细节就 略。

问题

使用此方式的最大问题就是只能单进程运行,除非可以保证同一key总能分配到同一进程。

    原文作者:Eriasuitor
    原文地址: https://segmentfault.com/a/1190000018128331
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞