运行 Tarantool Lua 另一个协程中的函数
Run Tarantool Lua function in another coroutine
我使用 NoSQL 数据库 Tarantool 并尝试使用 Lua 存储过程在数据库端做一些复杂的工作。我认为这是个好主意,因为我可以减少数据库调用并减少网络数据传输的开销。
我有一些 table:
user_counters: id, counter_a, counter_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)函数和returnuser_counters_tuple而不等待上一个函数执行完成?
只需使用 fiber.create(fun, ...):
local fiber = require('fiber')
-- start another coroutine recalc_score(id) and forget about it
fiber.create(recalc_score, id)
我使用 NoSQL 数据库 Tarantool 并尝试使用 Lua 存储过程在数据库端做一些复杂的工作。我认为这是个好主意,因为我可以减少数据库调用并减少网络数据传输的开销。
我有一些 table:
user_counters: id, counter_a, counter_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)函数和returnuser_counters_tuple而不等待上一个函数执行完成?
只需使用 fiber.create(fun, ...):
local fiber = require('fiber')
-- start another coroutine recalc_score(id) and forget about it
fiber.create(recalc_score, id)