LuaLanes Невозможно передать глобальные переменные между функциями (в одной полосе)
Надеюсь, у тебя хороший день.
Последние несколько дней я программировал IRC-чатбота в Lua, и, наконец, я хочу начать реализацию поддержки нескольких серверов.
До сих пор я создал irc-объект для управления каждым сервером, и все такое приятное - теперь у меня проблемы с многопоточностью.
Lua, как вы, наверное, знаете, не имеет встроенной поддержки потоков. LuaLanes и LuaThreads казались наиболее близкими к тому, что я хотел использовать, с точки зрения библиотек. Что заставило меня выбрать LuaLanes, так это то, что LuaThreads требует модифицированного ядра lua. Плюс ко мне попалась особенность lindas LuaLanes (для последующего использования в плагинах)
Во всяком случае, проблема, которую я имею, когда вы генерируете полосу с помощью функции middleman
(например), который затем вызывает другую функцию sqr
(например). если вы генерируете функцию как lanes.gen({globals = _G}, middleman)
, посредник будет иметь доступ ко всему в вашей текущей глобальной области, что именно то, что я хочу. Проблема в том, если middleman
звонки sqr
, а также sqr
использует что-то из глобальной области видимости, он выдает ошибку, как будто _G
внезапно опустел.
Вот пример кода, который мне удалось собрать вместе, используя мой пример выше:
require 'lanes'
function sqr()
print(5*5)
end
function middleman()
sqr()
end
gen = lanes.gen({globals = _G}, middleman)
print(gen()[1])
Выдает ошибку, говорящую:
tc@box:~$ lua lanestrouble.lua
lua: lanestrouble.lua:4: attempt to call global 'print' (a nil value)
stack traceback:
[C]: in function 'error'
./lanes.lua:190: in function <./lanes.lua:136>
lanestrouble.lua:13: in main chunk
[C]: ?
threading.c 399: pthread_cond_destroy(ref) failed, 16 EBUSY
Aborted
tc@box:~$
(Кстати, я использую Linux)
Однако, если вы измените строку 11 с gen = lanes.gen({globals = _G}, middleman)
в gen = lanes.gen({globals = _G}, sqr)
работает нормально.
Я проверил, и то же самое происходит, если вы передаете "*" (или любой другой параметр для параметра "libs_str") для загрузки библиотек по умолчанию.
Мне бы очень хотелось, чтобы была что-то вроде библиотеки потоков Java для Lua, именно так я и научился использовать потоки. (Я знаю, не самая идеальная среда, я полагаю)
Спасибо, я очень ценю помощь. Тем более что это полностью остановило мою разработку IRC ботов!:(
1 ответ
Изготовление sqr
местный делает свое дело. Так как это становится повышением стоимости посредника, это скопировано в новую полосу.
require 'lanes'
local function sqr()
print(5*5)
end
function middleman()
sqr()
end
gen = lanes.gen({globals = _G}, middleman)
print(gen()[1])
Но определенно происходит что-то странное. Я имею в виду, что даже при передаче явно "sqr" и "print" на новую полосу, он не увидит "print" (при вызове "sqr"). Мне кажется, что что-то не работает правильно при сериализации функций между полосами. Вы должны связаться с его сопровождающим.