tarantool 如何处理光纤外的 lua 错误

tarantool how to handle lua errors outside the fiber

我想知道,如何设置光纤错误抛出的回调。

示例:

local fiber = require("fiber")
local status = 0 --in my case stored in db

local function time_consuming()
    lua_error
    status = 0
end

function external_api_function()
    if status == 1 then return "already running" end

    status = 1
    fiber.create(time_consuming)
    return "started"
end

所以如果 time_consuming 函数失败,我想将状态设置为 0。有什么方法可以钓到它?

我考虑在下次 api 访问时检查 fiber:status。如果我希望状态有效,或者为光纤创建看门狗。这对我有用,但似乎不是最佳解决方案。

有多种方法可以实现您的目标。

在您的示例中,两个纤程(maintime_consuming 任务)共享相同的范围 - status 变量。如果您更改子纤程中 status 变量的值,父纤程将看到更新。您可以使用简单的代码段进行检查:

status = 1
fiber.create(function() status = 0 end)
print(status) -- 0

现在,要捕获异常,如果要分析捕获的错误,请使用 pcall function. It accepts a function as a first argument, calls it and returns status as a first value following one or more function results. There is also xpcall 函数。它将错误处理程序作为第二个参数。

使用 pcall,您可以像这样更改 time_consuming 函数:

local function time_consuming()
    local ok = pcall(function() lua_error end)
    if not ok then
        status = 0
    end
end
如果 lua_error 失败,

status 将成功更新。

但通常我认为这是一种不好的做法。如果更多的纤程共享相同的状态,由于纤程执行顺序的不确定性,可能会变得难以维护。因此,为了获得更可靠的解决方案,您可能希望使用又名 channels 的光纤间通信原语。您将能够使用 channel:put()channel:get() 函数明确要求子纤程告诉您其执行状态是否成功。有关示例,请参阅文档。