概数
async-lock的npm地址
https://www.npmjs.com/package...
为什么是async-lock?
因为我见其下载量比较大(在我发现的所有类似库中是最大的)且最近更新时间较近。
场景
- 在异步函数中,由于存在异步操作,对此函数的A,B两次执行会出现结束次序不可控。即A先执行,却比B后退出函数。
- 对于数据库的操作,有时会将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总能分配到同一进程。