2016-01-02 3 views
2

Я использую базу данных TASSQL и пытаюсь выполнить сложную работу на стороне БД с использованием хранимых процедур Lua. Я думаю, что это хорошая идея, потому что я могу делать меньше вызовов БД и иметь меньше накладных расходов при передаче сетевых данных.
У меня есть таблица:
user_counters: идентификатор, counter_a, counter_b, оценкаЗапустить функцию Tarantool Lua в другом сопрограмме

А, к примеру, у меня есть некоторые функции для вычисления поля оценка:

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 (идентификатор) функция и вернуть 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) 
+0

Так легко! Это просто отлично! Спасибо! –