当前位置: 首页 > 知识库问答 >
问题:

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

羊刚捷
2023-03-14

我想知道,我怎么能设置回调光纤错误抛出。

例子:

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

我考虑在下次api访问时检查光纤:状态。或者创建一个光纤看门狗,如果我想要状态是有效的。这对我有用,但似乎不是最好的解决方案。

共有1个答案

翟誉
2023-03-14

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

在您的示例中,两条光纤(maintime\u consumingtask)共享相同的作用域-status变量。如果更改子光纤中status变量的值,则父光纤将看到更新。您可以使用简单的代码段来检查这一点:

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

现在,要捕获异常,请使用pcall函数。它接受一个函数作为第一个参数,调用它并在一个或多个函数结果后返回状态作为第一个值。如果要分析捕获的错误,还可以使用xpcall函数。它将错误处理程序作为第二个参数。

使用pcall您可以更改耗时的功能,如下所示:

local function time_consuming()
    local ok = pcall(function() lua_error end)
    if not ok then
        status = 0
    end
end

状态将成功更新,如果lua_error失败。

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

 类似资料:
  • 有时您需要使用未维护的、旧的、脏的、巨大的、对我们的程序可能有危险的库。 是否有以安全方式执行此代码的最佳实践? 最近,我发现(可能是在我的知识和经验水平上)没有捕捉到异常。直到今天,我使用的常见做法是将代码包装到Fiber中,在内部捕获异常并通过Channel发送出去。现在它不工作(我不能把产量或Proc放在光纤中)。 危险的lib可以看起来像普通类,方法用Fiber.yield封装光纤,以便现

  • 主要内容:语法错误,实例,实例,运行错误,错误处理,实例,pcall 和 xpcall、debug,实例,实例程序运行中错误处理是必要的,在我们进行文件操作,数据转移及web service 调用过程中都会出现不可预期的错误。如果不注重错误信息的处理,就会造成信息泄露,程序无法运行等情况。 任何程序语言中,都需要错误处理。错误类型有: 语法错误 运行错误 语法错误 语法错误通常是由于对程序的组件(如运算符、表达式)使用不当引起的。一个简单的实例如下: 以上代码执行结果为: 正如你所看到的,以上出

  • 程序运行中错误处理是必要的,在我们进行文件操作,数据转移及web service 调用过程中都会出现不可预期的错误。如果不注重错误信息的处理,就会造成信息泄露,程序无法运行等情况。 任何程序语言中,都需要错误处理。错误类型有: 语法错误 运行错误 语法错误 语法错误通常是由于对程序的组件(如运算符、表达式)使用不当引起的。一个简单的实例如下: -- test.lua 文件 a == 2 以上代

  • 在构建基于光纤的塔兰托应用程序时,我遇到了一个意外的行为。 我的代码的简单复制器如下所示: 并打印到日志。此外,如果我使用以下: 它打印到log,如果我使用 它打印到log。 我预计在运行后,如果控件返回到外部光纤并调用,那么下次控件返回到取消的时,我们将进入循环迭代的末尾,在下一次迭代中,代码将成功返回1。但是,的工作结束时抛出错误,而不是返回。那么,生产纤维的真实生命周期是如何运作的呢?

  • 问题内容: 我知道有关使用协程作为基础并实现玩具调度程序的基本知识。但是我认为它对于整个异步调度程序来说过于简单了。我的想法中缺少一整套漏洞。 如何防止cpu运行正在空闲/正在等待的调度程序?一些光纤刚刚进入睡眠状态,其他一些则等待来自操作系统的输入。 问题答案: 您需要将io操作复用到基于事件的接口(选择/轮询)中,以便可以利用OS进行等待,同时仍然可以调度其他光纤。select / poll具

  • 如何为tarantool编写一个lua程序,它将在后台定期执行一些任务(例如每10分钟一次)?