Запустите функцию Tarantool Lua в другой сопрограмме

Я использую базу данных NoSQL Tarantool и пытаюсь выполнить некоторую сложную работу на стороне БД, используя хранимые процедуры Lua. Я думаю, что это хорошая идея, потому что я могу делать меньше вызовов БД и меньше накладывать расходы на передачу данных по сети.
У меня есть таблица:
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) и вернуть user_counters_tuple, не дожидаясь завершения предыдущего выполнения функции?

1 ответ

Решение

Просто используйте fiber.create(весело, ...):

local fiber = require('fiber')

-- start another coroutine recalc_score(id) and forget about it
fiber.create(recalc_score, id)
Другие вопросы по тегам