LuaLanes не может передавать глобальные переменные между функциями (по одной полосе)

#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 / Огромное спасибо! Очень признателен. По общему признанию, будет непросто сделать все локальным, но все еще пригодным для использования, но приятно узнать об обходном пути. (Я сказал спасибо?)