Как я могу получить глобалы или окружение из основного состояния в Lua Lane?
local lanes = require "lanes".configure()
local linda = lanes.linda()
local thread = lanes.gen({globals = _G}, function()
print("Starting thread...")
while true do
local command = linda:receive("cmd")
if command=="quit" then
break
else
broadcast(-1,"Hello from lanes.")
end
end
end)
local threads = {}
local NCORES = 2
for i=1,NCORES do threads[i] = thread() end
linda:send("cmd", "test")
for i=1,NCORES do linda:send("cmd", "quit") end
for i=1,NCORES do threads[i]:join() end
В качестве теста на моем игровом сервере для правильной работы Lua Lanes я пытаюсь использовать глобальную функцию из основного состояния в новом потоке. К сожалению, этот конкретный код продолжает приводить к Assert Failure in tools.c line 1216
, Я пытаюсь настроить это так, чтобы я мог выполнять занятую работу, не блокируя основной поток и, в конечном счете, мой игровой сервер. Возможно, есть лучший способ сделать это? Или, может быть, я мог бы запустить свои скрипты через luaL_newthread(state)
на моем сервере? Пожалуйста, посоветуйте мне правильное направление, так как это в настоящее время останавливает мое развитие. Заранее спасибо.
1 ответ
Вы не должны иметь доступ к таким глобальным переменным на линии. Поток запускается в отдельном состоянии. То, что вы получаете, является глубокой копией таблицы глобальных переменных (а не ссылки). Кроме того, вызывая глобальную функцию в отдельном потоке, вы рискуете проблемами с синхронизацией.
Что вы можете сделать, это require
модуль в самой теме. Чтобы получить broadcast
Функция в потоке, у вас есть эти варианты:
- Положил
broadcast
и другие функции в модуль и вызовrequire
в теме. -
хранитьbroadcast
какlocal
перед функцией потока, чтобы получить его в качестве повышения.
Обновление: к сожалению, второй способ не работает, как раньше. Из-за проблем совместимости с LuaJIT 2, Lanes должен вычислять таблицу отображения собственных функций в то время configure
это запустить. Я не нашел способ передать простую функцию C в поток иначе, чем на самом деле require
модуль в потоке.