2016-01-02 51 views
2

我使用NoSQL數據庫Tarantool並嘗試使用Lua存儲過程在數據庫端執行一些複雜的工作。我認爲這是個好主意,因爲我可以減少數據庫調用,並減少網絡數據傳輸的開銷。
我有一些表:
user_counters:ID,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(ID )函數並返回user_counters_tuple而不等待前一個函數執行完成時?

回答

1

只需使用fiber.create(FUN,...):

local fiber = require('fiber') 

-- start another coroutine recalc_score(id) and forget about it 
fiber.create(recalc_score, id) 
+0

那麼容易!它工作正常! 謝謝! –

相關問題