背景
openresty中使用lua提供业务的内容实现,有些客户请求或者处理过程需要有时效性,比如去第三方服务器获取数据,或者有其它io耗时的操作,而需要在限定时间内完成的场景。
实现方案
将需要执行的func和超时时间作为参数
-
semaphore
local semaphore = require "ngx.semaphore" function _M.run(func, timeout) local sema = semaphore.new(0) local process = function() sema:post() end ngx.thread.spawn(func, process) return sema:wait(timeout) end
- 双协程
function _M.run(func, timeout)
local task_th = ngx.thread.spawn(func)
local timeout_th = ngx.thread.spawn(function(timeout)
ngx.sleep(timeout)
error("timeout")
end, timeout)
local ok, res = ngx.thread.wait(task_th, timeout_th)
if not ok then
if res == "timeout" then
ngx.thread.kill(task_th)
return false, "timeout"
else
return false, res
end
end
ngx.thread.kill(timeout_th)
return true
end