#multithreading #lua #lua-lanes
#многопоточность #lua #lua-lines
Вопрос:
надеюсь, у вас хороший день.
Последние несколько дней я программировал 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
локального делает свое дело. Поскольку оно становится повышающим значением middleman, оно копируется в новую полосу.
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»). Мне кажется, что что-то не работает правильно при сериализации функций между полосами. Вам следует связаться с его сопровождающим.
Комментарии:
1. o / Огромное спасибо! Очень признателен. По общему признанию, будет непросто сделать все локальным, но все еще пригодным для использования, но приятно узнать об обходном пути. (Я сказал спасибо?)