Posted in

前端可以玩“锁”??了 – 掘金_AI阅读总结 — 包阅AI

包阅导读总结

1.

关键词:Web Locks API、多进程、数据库事务、浏览器、锁

2.

总结:本文主要介绍了 Web Locks API,指出“锁”常用于多进程语言和数据库事务架构,现在也用于 Web API 中,阐述了其在浏览器多标签页或 worker 中的使用,包括请求锁、监控锁的方法,以及锁的多种模式、条件获取、应急通道和中止锁定请求等相关配置。

3.

主要内容:

– Web Locks API

– 应用场景:常用于多进程语言和数据库事务架构,现用于 Web API

– 领域:在浏览器多标签页或 worker 中运行的脚本中使用

– 请求锁

– 同一源下持有锁时其他相同锁请求排队,释放后第一个排队请求授予

– 回调函数执行完毕自动释放

– 可选参数:如传递选项

– 监控锁

– 用于判断锁管理器状态,利于调试

– 实现

– 从异步任务返回值

– 共享锁和独占锁模式

– 条件获取

– 防止死锁的应急通道

– 中止锁定请求,超时时会报异常错误需捕获

思维导图:

文章地址:https://juejin.cn/post/7382640456109490211

文章来源:juejin.cn

作者:CC码码

发布时间:2024/6/21 9:02

语言:中文

总字数:935字

预计阅读时间:4分钟

评分:90分

标签:前端,JavaScript


以下为原文内容

本内容来源于用户推荐转载,旨在分享知识与观点,如有侵权请联系删除 联系邮箱 media@ilingban.com

大家好,我是CC,在这里欢迎大家的到来~

“锁”经常使用在多进程的语言理和数据库事务的架构当中,现在 Web API 当中也提供了“锁”- Web Locks API

领域

在浏览器多标签页或 worker 中运行的脚本中获取锁,执行工作时保持锁,最后释放锁。

锁的范围仅限于同一源内

请求锁

同一源下,当持有锁时,其他相同锁的请求将排队,仅当锁被释放时第一个排队的请求才会被授予锁。

回调函数执行完毕后锁会自动释放

navigator.locks.request('mylock', {}, async (lock) => {  console.log(lock);});

在这里我们能看到 request 方法的第二个参数(可选),可以在请求锁时传递一些选项,这个我们在后边会介绍到。

监控锁

判断锁管理器的状态,有利于调试;返回结果是一个锁管理器状态的快照,标识了持有锁和请求中的锁的有关数据,像名称、client_id和模式。

navigator.locks.query().then((locks) => {  console.log(locks);});

实现

接下来将使用请求锁的可选参数实现以下内容:

从异步任务返回值

request() 方法本身返回一个 Promise,一旦锁被释放,该 Promise 就会 resolve。

const result = await navigator.locks.request('ccmama'}, async (lock) => {    return data;});console.log(result);

共享锁和独占锁模式

配置项 mode 默认是 ‘exclusive’,可选项还有 ‘shared’。

锁只能有一个持有者,但是可以同时授权多个共享。

在读写模式中经常使用 ‘shared’ 模式进行读取,’exclusive’ 模式用于写入。

navigator.locks.request('ccmama', {  mode: 'shared',}, async (lock) => {  });

📢

持有 ‘exclusive’ 锁,同名 ‘exclusive’ 锁排队等候

持有 ‘exclusive’ 锁,同名 ‘shared’ 锁排队等候

持有 ‘shared’ 锁,同名 ‘shared’ 锁也可访问同一资源

持有 ‘shared’ 锁,同名 ‘exclusive’ 锁排队等候

条件获取

配置项 ifAvailable 默认 false,当设置 true 时锁请求仅在不需要排队时才会被授予,也就是说在任务没有其他等待的情况下锁请求才会被授予,否则返回 null。

navigator.locks.request('ccmama', { ifAvailable: true }, async lock => {  if (!lock) return;  });

注意:同名锁

防止死锁的应急通道

配置项 steal 默认 false,当设置为 true 时任何持有的同名锁将被释放,并且请求将被授权,抢占任何排队中的锁请求。

navigator.locks.request('ccmama', { steal: true }, async lock => {  });

⚠️

使用要小心。之前在锁内运行的代码会继续运行,并且可能与现在持有锁的代码发生冲突。

中止锁定请求

配置项 signal 是 AbortSignal 类型;如果指定并且 AbortController 被中止,则锁请求将被丢弃。

try {  const controller = new AbortController();  setTimeout(() => controller.abort(), 400);  navigator.locks.request('ccmama', { signal: controller.signal }, async lock => {    });} catch(ex) {}try {  navigator.locks.request('ccmama', { signal: AbortSignal.timeout(1000) }, async lock => {      });} catch(ex) {}

⚠️

超时时会报出一个异常错误,需要使用 try catch 捕获

参考文章

可能理解并不一定到位,欢迎交流。