今天遇到一个问题,在大厅服务中,若是一个请求使用到了一个公共的变量,如何保证其一致性?
虽然请求是挨个运行的,可是skynet.call会阻塞。git
“同一个 skynet 服务中的一条消息处理中,若是调用了一个阻塞 API ,那么它会被挂起。挂起过程当中,这个服务能够响应其它消息。这极可能形成时序问题,要很是当心处理。”
在其余语言中,好比c#,咱们使用lock的办法,把变量或者执行的代码锁起来。
在skynet中用下面的办法解决github
local sk_queue = require "skynet.queue" local cs = sk_queue() 把要执行的代码写到cs里面 cs(func1) 这样就好了。
相似的须要当心的还有 ipairs pairs的遍历。
遍历pairs的时候很是当心别变更pairs(t)里面的t的结构。
不然会发生一些莫名其妙的事情。有时间作作实验。c#
ipairs (t)
返回三个值(迭代函数、表 t 以及 0 ), 如此,如下代码函数
for i,v in ipairs(t) do body end
将迭代键值对(1,t[1]) ,(2,t[2]), ... ,直到第一个空值。ui
pairs (t)
若是 t 有元方法 __pairs, 以 t 为参数调用它,并返回其返回的前三个值。code
不然,返回三个值:next 函数, 表 t,以及 nil。 所以如下代码ip
for k,v in pairs(t) do body end
能迭表明 t 中的全部键值对。get
参见函数 next 中关于迭代过程当中修改表的风险。it