今天遇到一个问题,在大厅服务中,如果一个请求使用到了一个公共的变量,如何保证其一致性?

虽然请求是挨个运行的,但是skynet.call会阻塞。

“同一个 skynet 服务中的一条消息处理中,如果调用了一个阻塞 API ,那么它会被挂起。挂起过程中,这个服务可以响应其它消息。这很可能造成时序问题,要非常小心处理。”

在其他语言中,比如c#,我们使用lock的办法,把变量或者执行的代码锁起来。

在skynet中用下面的办法解决

local sk_queue =  require "skynet.queue"
local cs = sk_queue()
把要执行的代码写到cs里面
cs(func1)
这样就行了。

类似的需要小心的还有 ipairs pairs的遍历。

遍历pairs的时候非常小心别变动pairs(t)里面的t的结构。

否则会发生一些莫名其妙的事情。有时间做做实验。

ipairs (t)

返回三个值(迭代函数、表 t 以及 0 ), 如此,以下代码

 for i,v in ipairs(t) do body end

将迭代键值对(1,t[1]) ,(2,t[2]), ... ,直到第一个空值。

pairs (t)

如果 t 有元方法 __pairs, 以 t 为参数调用它,并返回其返回的前三个值。

否则,返回三个值:next 函数, 表 t,以及 nil。 因此以下代码

 for k,v in pairs(t) do body end

能迭代表 t 中的所有键值对。

参见函数 next 中关于迭代过程中修改表的风险。

https://github.com/cloudwu/skynet/wiki/CriticalSection

白话skynet第三篇:通过队列解决多线程竞争资源的更多相关文章

  1. 第三篇:彻底解决ssh.invoke_shell() 返回的中文问题

    接上一篇,前两篇解决中文的问题主要是在字符集上做的手脚,即将中文转成英文,但是有一种情况我们都来不及做转换,即登录时服务器直接返回了中文内容: 此时程序报了如下错误,其实还是字符集问题: 为此:我们可 ...

  2. 用读写锁三句代码解决多线程并发写入文件 z

    C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...

  3. Java并发编程之CAS第三篇-CAS的缺点及解决办法

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

  4. RabbitMQ学习总结 第三篇:工作队列Work Queue

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  5. 第三篇——第二部分——第六文 监控SQL Server镜像

    原文:第三篇--第二部分--第六文 监控SQL Server镜像 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26846203 要优化, ...

  6. 第三篇 功能实现(2) (Android学习笔记)

    第三篇 功能实现(2) ●Activity的四种启动模式 Activity的启动模式有四种,分别是standard.singleTop.singleTask和singleInstance. 在Andr ...

  7. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  8. (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...

  9. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

随机推荐

  1. js 获取两个时间戳之间相隔多少天多少小时多少分多少秒

    <script> function getRemainderTime (startTime){ var s1 = new Date(startTime.replace(/-/g, &quo ...

  2. ELK统一日志系统的应用

    收集和分析日志是应用开发中至关重要的一环,互联网大规模.分布式的特性决定了日志的源头越来越分散, 产生的速度越来越快,传统的手段和工具显得日益力不从心.在规模化场景下,grep.awk 无法快速发挥作 ...

  3. pandas 必背函数操作

    1.五个常用属性 index,columns,shape,values,dtypes2.常用函数:set_index,reset_index,del df['column_name'],pd.read ...

  4. 基于for循环的呼吸灯

    #include "stm32f10x.h" #include "stm32f10x_gpio.h" //#include "led.h" ...

  5. [PA2014]Matryca

    [PA2014]Matryca 题目大意: 有一堵长度为\(n(n\le10^6)\)的墙需要刷漆,你有一把长度为\(k\)的刷子.墙和刷子都被均匀划分成单位长度的小格,刷子的每一格中都沾有某种颜色的 ...

  6. LCA的在线与离线算法

    在线:链接 离线:链接

  7. img标签与span一起使用不在同一条线上

    布局时 img标签与span标签在同一行是不能垂直,解决办法:在 img标签添加一个 vertical-align:middle; 即 <!-- img与span的文字与图片保持同一条水平线 在 ...

  8. Mybatis_1(认识)一个简单的HelloWorld

    1. 介绍: MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBatis可以使用简单的XM ...

  9. __x__(49)0910第六天__命名规范

    id class 命名规范: 小驼峰命名法: aaaBbbCcc,helloWorld 大驼峰命名法: AaaBbbCcc,HelloWorld 匈牙利命名法: 类型+描述 formUserName, ...

  10. Java课程课后作业190309之连续最大子数组

    老师在课堂是提出了这个问题,并且提出了时间复杂度是O(n)的要求,一开始我自己思想简单,在逻辑上出现了十分粗心的错误,后来同学们也在课堂上比较激烈地讨论了一番,也只是将时间复杂度降到了O(n*n),在 ...