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"). Мне кажется, что что-то не работает правильно при сериализации функций между полосами. Вы должны связаться с его сопровождающим.

Другие вопросы по тегам