按关键词阅读:
文章插图
什么是锁(Locks)?计算机变得越来越强大 , 而且可以使用多个 CPU 线程来对数据进行处理 。 多个线程访问单个资源的时候可能会受同步问题的困扰 , 因此催生出了有关资源共享的新问题 。
如果你对线程熟悉的话 , 那么你应该也了解锁的概念 。 锁是一种同步方法 , 可强制对线程进行数据访问限制 , 防止多个线程同时访问单个资源 。 还有一种锁的变体 , 允许多个线程同时访问单个资源 , 不过仍将访问限制为只读 。 我强烈建议你去查阅一些文献 , 理解操作系统中锁的概念 。
文章插图
什么是 Web Locks API?Web Locks API 将上面提到的锁(Locks)应用于 web 应用 。 这个 API 允许一个脚本异步持有对资源的锁定 , 直到其处理完成之后再释放 。 当持有锁时 , 除一种特殊情况外 , 其他在同域下的脚本无法获得相同资源的锁 。 接下来我们就说说这个特殊情况 。
执行流程是什么样子的呢?
- 申请锁 。
- 在异步任务中锁定时完成工作 。
- 任务完成时候锁自动释放 。
- 允许其他脚本申请锁 。
锁以及其作用域关于 Web Locks API 的作用域可能会很令人困惑 。 这仅仅是一个摘要 , 以供你更好地理解 。
- 根据文档说明 , 锁的作用域同样存在同源限制 。
- 浏览器中单个用户配置被视为独立的用户代理 , 视为在作用域之外 。 因此 , 即使他们的同源 , 也不会共享锁管理器 。
- 私有模式的浏览会话(隐身模式)被视为单独的用户代理 , 视为在作用域之外 。 因此 , 即使他们的同源 , 也不会共享锁管理器 。
- 在同源且同一个上下文中的脚本视为在作用域之内 , 并共享锁管理器 。 例如 , 一个网页上的两个函数尝试获得同一资源的锁 。
- 打开在同一个用户代理的同源页面和 Workers(agents)共享锁管理器 , 即使他们不在相关的浏览上下文中 。
上面提到的这些资源是什么?好吧 , 它们代表了一种抽象资源 。 只是我们想出的一个名称 , 指的是我们想要保留的资源 。 它们在调度算法之外没有任何意义 。
换言之 , 在上面的例子中 , 我们可以将 资源 X 看成存储我数据的数据库 , 或者是 localStorage。
为什么资源协调很重要?在简单的 Web 应用程序中很少需要进行资源协调 。 但是 , 哪些大量使用 JavaScript 的复杂 Web 应用程序可能需要进行资源协调 。
如果你使用跨多个 Tab 的应用程序并且其可以执行 CRUD 操作 , 你将必须保持选项卡同步以避免问题 。 如果用户在一个 Tab 上打开了文本编辑的 Web 应用程序 , 而忘记了另一个 Tab 也打开了同一应用程序 。 现在 , 他具有正在运行的同一应用程序的两个 Tab 。 如果他在一个 Tab 上执行一项操作 , 并尝试在另一 Tab 上执行完全不同的操作 , 则当同一资源上被两个不同的进程操作时 , 服务器上可能会发生冲突 。 在这种情况下 , 建议获取对资源的锁定并进行同步 。
此外 , 可能存在用户打开了股票投资 Web 应用程序的两个 Tab 的情况 。 如果用户使用其中一个打开的 Tab 购买了一定数量的股票 , 则两个 Tab 必须保持同步 , 以避免出现客户错误地再次进行交易的情况 。 一个简单的选择是一次只允许应用程序的一个 Tab 或窗口 。但是请注意 , 可以通过使用隐身模式来绕过这个限制 。
尽管可以使用诸如 SharedWorker , BroadcastChannel , localStorage , sessionStorage , postMessage , unload handler 之类的 API 来管理选项卡通信和同步 , 但它们各自都有缺点 , 并且需要变通办法 , 这降低了代码的可维护性 。Web Locks API 试图通过引入更标准化的解决方案来简化此过程 。
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J3025R020.html
标题:Web Locks API: 跨 Tab 资源同步