-
根据 skynet框架中 定时器实现 时间轮算法 中的时钟滴答数为: T -> time
在lua层调用skynet.timeout(ti, call_back_func)中,会来到lua层-c层的接口 // 文件在skynet/lualib-src/lua-skynet.c
// 代码在该文件的 static int lintcommand() 函数中
if (lua_gettop(L) == 2) {
if (lua_isnumber(L, 2)) {
// 这里获取到 lua层skynet.timeout()传入的ti
int32_t n = (int32_t)luaL_checkinteger(L,2);
// 这里n的正数部分:[0, 2147483647]
sprintf(tmp, "%d", n);
parm = tmp;
} else {
parm = luaL_checkstring(L,2);
}
} 当我lua层设置的 expire > 2147483647时,即 skynet.timeout(expire,call_back_func) 会直接导致 n 发生溢出,此时 n < 0,最后在skynet的判定下 expire < 0,立马执行了
我的疑问: 假设我要设一个300天后到期的定时器(虽然不会这么写),按照定时器的实现,300天的时间是支持的 但是通过skynet.timeout(300 * 86400 * 100,call_back_func),传进去的300 * 86400 * 100最后溢出变为-1702967296 -1702967296 = time < 0,此定时器立即执行 既然在定时器的实现中,已经把定时器有效时间范围设定在[0,4294967295] 在调用的API层的时间范围却只能是[0,2147483647] 为什么要这么设计呢? |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment
-
因为实现和接口是两码事。 |
Beta Was this translation helpful? Give feedback.
因为实现和接口是两码事。
skynet 并不支持超过 300 天的定时器。
我认为这个限制是 300 天还是 600 天并无区别,终究它有一个限制。