nodejs中的鎖——async-lock解析

概數

async-lock的npm地址數據庫

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

爲何是async-lock?數組

由於我見其下載量比較大(在我發現的全部相似庫中是最大的)且最近更新時間較近。異步

場景

  1. 在異步函數中,因爲存在異步操做,對此函數的A,B兩次執行會出現結束次序不可控。即A先執行,卻比B後退出函數。
  2. 對於數據庫的操做,有時會將select的值進行一系列業務變化後從新update至數據庫。就好比簡單的計數器,0開始計數,假設因爲業務緣由,
    必須在代碼中進行+1操做。則A讀取數據庫進入異步執行,此時B也開始執行讀取數據庫的代碼,最終後形成兩次執行後計數器只加了1。

此時便須要鎖機制,相似於Java中的synchronized或者lock。執行同一段代碼時,添加相同的key,則發現此key正在使用,則直接放入此key的待執行數組。async

async-lock原理

AsyncLock類:函數

  • queues:用於存儲全部的待執行函數,格式爲:{key: [function, function]}
  • acquire(key, fn):ui

    • key:須要上鎖的名稱,即queues中的key
    • fn:爲須要執行的函數。操做即將fn添加到queues[key]對應的數組中。若queues無此key字段,則將起值置[]後直接執行。

當key對應函數執行完畢後,會檢查queues中對應key值數組是否爲空,爲空則執行delete queues[key],不然繼續執行下一個待執行函數。code

其他使用細節就 略。進程

問題

使用此方式的最大問題就是隻能單進程運行,除非能夠保證同一key總能分配到同一進程。get

相關文章
相關標籤/搜索