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

在另一个协程中运行Tarantool Lua函数

聂季同
2023-03-14

我使用NoSQL数据库Tarantool,并尝试使用Lua存储过程在数据库端做一些复杂的工作。我认为这是个好主意,因为我可以做更少的数据库调用,网络数据传输的开销也更小。
我有一些表格:
用户计数器:id,计数器a,计数器b,分数

例如,我有一些函数来计算字段分数:

function recalc_score(id)
   local stream = box.space.user_counters:select { id }
   local rating = 0
   -- some_rating_calculation using counter_a and counter_b here
   box.space.user_counters:update(id, { { '=', 4, rating } })
end

我有另一个功能字段counter_a和counter_b更新:

function update_user_counters(id, counter_a_diff, counter_b_diff)
    local rating_default = 0
    local user_counters_tuple = box.space.user_counters:upsert(
        { id, counter_a_diff, counter_b_diff, rating_default },
        { { '+', 2, counter_a_diff }, { '+', 3, counter_b_diff } }
    )
    -- start another coroutine recalc_score(id) and forget about it
    return user_counters_tuple
 end

如何调用recalc_score(id)函数并返回user_counters_tuple而不等待以前的函数执行何时完成?

共有1个答案

孙胜泫
2023-03-14

只需使用光纤即可。创建(乐趣,…):

local fiber = require('fiber')

-- start another coroutine recalc_score(id) and forget about it
fiber.create(recalc_score, id)
 类似资料:
  • 我有工人班 还有一个窗口类,它使用tkinter 但是,即使长任务()是在一个单独的线程中运行,我的GUI冻结-为什么? 我的目标是更新窗口中的一个进度条,而长任务()正在运行。长任务()内部更新一个数字,范围从0到100。 问题:在longTask()运行时,如何实现这一点并防止GUI冻结? 注意:显然线程不是在我调用t.start()时启动的,而是在我通过t=线程启动线程时启动的。线程...

  • 问题内容: 我想在另一个goroutine中运行一些缓慢的例程,这样做是否安全: 这样做有什么陷阱吗? 问题答案: 服务每个http请求都在其自己的goroutine中运行。您可以从处理程序中启动新的goroutine,它们将并发运行,与执行处理程序的goroutine独立。 要注意的一些事情: 新的goroutine与处理程序goroutine独立运行。这意味着它可能在处理程序goroutine

  • 在一个android服务中,我创建了用于执行一些后台任务的线程。 我遇到一个情况,线程需要在主线程的消息队列上发布特定任务,例如。 有没有方法获取主线程的并从我的另一个线程向它发布/?

  • 我不明白为什么下面的代码会打印两次。我以为应该是个人和学生。当通过“a”对象调用printPerson()内部的getInfo()时,为什么要调用Person类内部的一个,为什么不调用Student类中的一个?提前谢谢。

  • 我创建了一个dash应用程序来显示另一个代码正在收集的信息,我希望使用Python中的asyncio模块同时运行这两个应用程序。 我的代码使用异步函数,Dash应用程序(基于Flask)在服务时阻止其他任何东西执行。 我不确定这是否需要打开更多的线程。 这是我当前的代码,它只运行主协程。 如何同时运行main和_dashboard?

  • 问题内容: 我想从Java代码运行另一个应用程序。 进程已启动,但在后台运行。如何使其在前台运行? 问题答案: 您应该告诉cmd.exe您希望它在新窗口中打开: