nodejs中的单进程异步锁——async-lock

nodejs中的单进程异步锁,node异步锁,async-lock

为什么是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总能分配到同一进程。

示例

示例一:

结果:

显然这不是你所期望的,使用async-lock,您可以轻松地编写异步临界区,如下:

示例二:

示例三(错误处理):

示例四(获取多个键):

示例五(重用锁):

锁在同一个域中可重用

示例六(配置项):

注:未经实测,只是照抄!

——————————-

npm地址 https://www.npmjs.com/package/async-lock

git地址 https//github.com/rogierschouten/async-lock

Node 进程互斥锁模块 – lockman

 

承接各种网站开发与修改、爬虫、数据采集分析、小程序等任务

Html+Css+JS+PHP+Nodejs+Python

专治网站各种不服

一起探讨,互相学习,共同进步!有事儿您说话。

This entry was posted in NodeJS and tagged , , , by 织梦先生. Bookmark the permalink.