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。如果我希望状态有效,或者为光纤创建看门狗。这对我有用,但似乎不是最佳解决方案。
有多种方法可以实现您的目标。
在您的示例中,两个纤程(main
和 time_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()
函数明确要求子纤程告诉您其执行状态是否成功。有关示例,请参阅文档。
我想知道,如何设置光纤错误抛出的回调。
示例:
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。如果我希望状态有效,或者为光纤创建看门狗。这对我有用,但似乎不是最佳解决方案。
有多种方法可以实现您的目标。
在您的示例中,两个纤程(main
和 time_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()
函数明确要求子纤程告诉您其执行状态是否成功。有关示例,请参阅文档。