分布式锁
不同版本的控制器、插件和上位机支持不同的 lua API 指令,开发者可在 DobotStudio Pro “应用” 菜单,“脚本编程” 的指令侧边栏查看具体支持的 lua API
说明
分布式锁模块的引入主要是为了解决多模块使用相同资源产生的数据冲突的问题。
一个典型的应用场景就是: 夹爪和相机同时使用末端的 485 来进行通讯,双方的插件以及 用户脚本分别都需要和末端的 485 进行通讯,而 485 模块无法决定某一时间“独属于”某一个通讯双方 ,因而需要引入一个额外的工具来处理资源之间的独占关系。
举例说明超时锁的作用:
假定有一个打印机,可以立即打印出来收到的打印的请求。 有 A,B,C 三个用户有打印需求,他们需要的打印任务分别是 A1,A2,A3... A10 ,B1,B2...B10,C1...C10 , 如果他们之间无沟通 且都是在自己需要的时候进行打印,此时的输出可能是 A1,B1,A2,C1, 等杂乱的情形,此时打印出来的内容 不符合任何一个用户的需求,用户需要复杂的逻辑去将自己的数据整理出来,甚至有的时候可能拿到的数据就是错误的。 此时新增一位”管理员“,专门负责管理“打印机” 的使用,假定 A 最早发现了自己的打印需求,并且 A 及时的将打印的需求上报给管理员,此时管理员会记录“打印机独属” 于 A 2min , A 可以在接下来的两分钟内打印自己需要的内容。 而 B 和 C 在这期间尝试将自己的需求上报给管理员,管理员会让 B 和 C 等待。直到 A 的 2 分钟用完,或者是 A 提前用完,管理员才会告知 B 和 C 打印机可以用了。
总的时间图大概是这样的:
① 此时 资源 “打印机”空闲,A 用户尝试申请使用权限,立即获批,获批后 A 给出了大概的申请使用时间(此时间不会无限多,目前设计中最大为 10 秒)。
② 资源 “打印机” 开始被使用
③ B 申请使用 资源,管理员知道此时资源还在 A 手中,所以拒绝 B 的申请。让 B 再等等。
④ B 再次申请,再次被拒绝。
⑤ C 开始申请 资源 “打印机”,管理员拒绝了 C 的请求。
⑥ A 主动告诉管理员,资源 “打印机” 的使用结束了。
⑦ B 在 A 结束的使用结束后一段时间 申请了 资源 “打印机” ,管理员告知 B 可以使用了。
⑧ C 在 B 主动结束使用打 印机后,通过向管理员申请 获得了资源的使用权限。
⑨ C 开始使用资源。
⑩ C 发现第一次和管理员说明的使用时间不太够,需要更多的时间,于是 C 在申请时间未结束的时候向管理员再次申请了资源,此时资源还在 C 哪里被使用,管理员同意 C 的续租。
接口
Lock(name,TimeOut,WaitTime)
- 作用: 申请锁定资源,仅能申请
- 参数说明:
| 参数 | 范围 | 说明 |
|---|---|---|
| name | 不包含空格的字符串 | 暂时未设置长度上限,但是建议不要超过 128 字节 |
| TimeOut | [10,10000] | 申请独占资源的时间,单位毫秒 |
| WaitTime | [0,0x7FFFFFFF] | 可选参数,等待的超时时间,0 为不等待立即返回,大于 0 为等待的最大时间。 内部使用 u32 类型。 |
- 返回值介绍:
| 返回值 | 范围 | 说明 |
|---|---|---|
| err | true/false | 是否成功 ,成功为 true ,失败为 false |
UnLock(name)
- 函数的作用: 主动释放资源。
- 参数的介绍:
- name: 要释放的资源的名字,字符串类型,范围,内容以及建议同 TimeOutLock
- 返回值介绍:
| 返回值 | 说明 |
|---|---|
| err | 是否删除是否有错误,true:无错误, false:有错误 |