首页需要调用很多service来渲染页面,最开始我用的顺序执行,后来想到有ngx.thread.spawn这个功能,于是自己试着写了一下。
大致说一下:目前是2个线程调用不同的service直接对页面部分数据赋值,所以这里spawn没有返回值。
wait到当前线程异常时,调用kill, 将后面的线程终止:
- 考虑到后面的线程可能已经运行完成,kill会出错,于是想先用status判断下,再kill,后来一想,整个 (判断-kill) 过程对于子线程不是原子操作,于是就直接kill了,只要出错消息是“already waited or killed”就不管了。
请大家帮着review一下,是否有问题?我本地测试是ok的。
最后问一下春哥:对于一个页面只需要2-3个数据源的时候,还需要采用这种方式吗?还是只要超过1个数据源的时候总是建议使用这种方式?
local view = template.new("index.template", "layout.template")
view.title = "首页"
local threads = {
ngx.thread.spawn(function(from, to)
local err
view.topics, err = topicService:list(from, to)
if not view.topics then
error(err)
end
end, 0, 10),
ngx.thread.spawn(function(token)
local err
view.numofmsg, err = messageService:getNumOfUnreadMessageByToken(token)
if not view.topics then
error(err)
end
end, ngx.var.cookie_wisekerid)
}
local ok
for i = 1, #threads do
local err
ok, err = ngx.thread.wait(threads[i])
if not ok then
ngx.log(ngx.ERR, err)
for j = i + 1, #threads do
local _, killErr = ngx.thread.kill(thread[j])
if killErr and killErr ~= 'already waited or killed' then
ngx.log(ngx.ERR, err)
end
end
end
end
if not ok then
return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end
return view:render()