searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

lua限时执行

2024-10-11 10:17:19
0
0

背景

openresty中使用lua提供业务的内容实现,有些客户请求或者处理过程需要有时效性,比如去第三方服务器获取数据,或者有其它io耗时的操作,而需要在限定时间内完成的场景。

实现方案

将需要执行的func和超时时间作为参数

  1. 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
  2. 双协程
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
0条评论
0 / 1000
张****东
7文章数
0粉丝数
张****东
7 文章 | 0 粉丝
张****东
7文章数
0粉丝数
张****东
7 文章 | 0 粉丝
原创

lua限时执行

2024-10-11 10:17:19
0
0

背景

openresty中使用lua提供业务的内容实现,有些客户请求或者处理过程需要有时效性,比如去第三方服务器获取数据,或者有其它io耗时的操作,而需要在限定时间内完成的场景。

实现方案

将需要执行的func和超时时间作为参数

  1. 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
  2. 双协程
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
文章来自个人专栏
直播
7 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0