LuaLanes Невозможно передать глобальные переменные между функциями (в одной полосе) - PullRequest
2 голосов
/ 30 мая 2011

надеюсь, что у вас хороший день.

Я программировал IRC-чатбота в Lua в последние несколько дней, и, наконец, я хочу начать реализовывать поддержку нескольких серверов.

До сих пор я создал irc-объект для управления каждым сервером, и все эти приятные вещи - теперь у меня проблемы с многопоточностью.

Lua, как вы, наверное, знаете, не имеет встроенной поддержки потоков.LuaLanes и LuaThreads казались наиболее близкими к тому, что я хотел использовать, с точки зрения библиотек.Что заставило меня выбрать LuaLanes, так это то, что LuaThreads требует модифицированного ядра lua.Плюс ко всему, мне понравилась функция lindas в LuaLanes (для последующего использования в плагинах)

В любом случае, у меня возникает проблема, когда вы генерируете полосу с помощью функции middleman (например), котораязатем вызывает другую функцию sqr (например).если вы сгенерируете такую ​​функцию, как lanes.gen({globals = _G}, middleman), посредник получит доступ ко всему в вашей текущей глобальной области действия, а это именно то, что я хочу.Проблема заключается в том, что если middleman вызывает sqr, а sqr использует что-то из глобальной области видимости, это выдает ошибку, почти как если бы _G внезапно стал пустым.

Вот пример кода Iудалось бросить вместе, используя мой пример выше:

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 Ответ

3 голосов
/ 31 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...