Highly Likely
5.1 is outdated.
Highly Likely
And dont claim personal bias...
Highly Likely
Puc-lua, as you call it, is not a reference implementation. it is Lua. At version 5.3. LuaJIT is not.
Highly Likely
LuaJIT does not even implement current Lua features. it simply is not Lua.
Highly Likely
LuaJIT was a try to add JIT to Lua 5.1 and is has been stuck there while Lua evolved to what is now Lua 5.3 and soon 5.4.
Highly Likely
This group is about Lua. If you want to discuss LuaJIT, please create your own group.
Igor
О, спасибо
Igor
Ну да, так и думал
Highly Likely
Но один поинт есть хороший: LuaJIT не полностью поддерживает 5.1, насколько мне известно
Igor
Но один поинт есть хороший: LuaJIT не полностью поддерживает 5.1, насколько мне известно
Я такого что-то не замечал, вроде все возможности реализованы
Igor
Было один раз, что luajit вёл себя как-то иначе, в сравнении с lua 5.1 у меня, но это было давно и во время какой-то из моих бессоных ночей, так что я не до конца уверен, было ли
Igor
Ещё я вспомнил, что у меня по какой-то ну очень странной причине luajit крашился, когда я использовал метаметод __add чтобы реализовать объединение строк их сложением. В общем если часто происходил вызов этого метаметода, то lj крашился, но стоило заменить "+" обратно на ".." в конкретном месте, как сразу же краш пропадал
Igor
У меня было предположение, что это происходило из-за того, что я криворукий и через ffi в каком-то месте повредил память и сам этого не заметил, но краш этот происходил только при использовании соединения строк посредствам метаметода, больше никогда он не вылезал
Snusmumriken
Но один поинт есть хороший: LuaJIT не полностью поддерживает 5.1, насколько мне известно
Насколько я в курсе, luajit полностью покрывает 5.1 и даже немножко больше. И вот за это "немножко больше", да и просто за наличие глобальной таблички jit — оно уже автоматом становится "не 5.1" ))
Snusmumriken
Ещё у луажыта, например, xpcall поддерживает аргументы для вызываемой функции, как у 5.2 и далее. Типа: xpcall(func, traceback, arg1, arg2, ...), ещё goto оттуда же, и всякая такая мелочёвка. Ууу нисоответствие стондартам ))
Snusmumriken
Можно вспомнить язык pl/1, у которого даже родной компилятор не соответствует стандарту (уж очень большой, и даже реализаторам влом было).
Igor
Мне вот переодически, разве что, не хватает bitwise операций не вызовами функций из таблички bit, а операторами, как в 5.3
Igor
Всё равно, позиция у него странная. Это всё равно, что сказать "ядро Linux 4.x перестало быть линуксом после появления ветки 5.x". Хотя может он так и думает.
Snusmumriken
Ну ды ))
Snusmumriken
Мне пришлось сейчас ему объяснять суть версионирования. Интересно, зобанит или нет.
Snusmumriken
Я видел как он общается. Кажется, и правда не понимает. Очень упёртый человек. Правда, ему столько лет, что не факт что он в принципе может стать гибче.
Snusmumriken
Прост мне довелось года три назад поспорить с ним на этот счёт, и мне грозили баном, поэтому я такой: "ок, палехчи" ))
Lucky
Толку-то с этих споров?
Lucky
Одно дело - выяснять в процессе обсуждения подробности того, что и как работает, другое - эти вот религиозные срачики пустопорожние.
Pavel
Понял, спасибо) жаль что нет решения в самом luarocks.
Если стоит несколько версий Lua, то LuaRocks c ключиком —lua-version может ставить пакеты для нужной версии.
Pavel
Есть софт (ip-pbx asterisk), в котором Lua используется для описания планов набора. При старте asterisk грузит конфиг на Lua и запускает его интерпретацию при каждом звонке. Все замечаиельно, но если в коде есть require(), то происходит считываение этого модуля из файловой системы при каждом запуске. Как с этим обстоит в других системах со встроенным Lua, может можно как-то закэшировать модули?
Yuriy
Есть софт (ip-pbx asterisk), в котором Lua используется для описания планов набора. При старте asterisk грузит конфиг на Lua и запускает его интерпретацию при каждом звонке. Все замечаиельно, но если в коде есть require(), то происходит считываение этого модуля из файловой системы при каждом запуске. Как с этим обстоит в других системах со встроенным Lua, может можно как-то закэшировать модули?
В астериске и Freeswitch динамическое создание тредов на каждый новый звонок. Поэтому запуск luastate происходит в каждом вновь созданном потоке (которые генерится для каждого нового звонка). nginx и kamailio сделаны по другому. Там luastate запускается один раз при старте на каждый поток - воркер, которые запускаются как пул в начале. соответсвенно и luastate запускается один раз
Anonymous
В луа же есть кстати какое то вспоможение для разделяемых стейтов в одном. Типа Sol::thread Это какая то хитрая штука или просто текущая корутина?
Yuriy
Проверил - на каждый звонок в астериске 3 раза выполняется extensions.lua (дергал http.request из общей части конфига ).
суть того, о чем я говорю в том, что luastate создается каждый раз. Соответственно коннект к сокетам, require и тд исполняются каждый раз Сколько раз extensions.lua выполняется для вашего конкретного конфига - хз. В общем и целом он выполняется 1 раз, но если у вас там висят всякие hangup handlers то может и больше раз вызываеться
Yuriy
ну... такой конфиг смысла то особого не имеет... как минимум касаемо require и http.request
Pavel
ну... такой конфиг смысла то особого не имеет... как минимум касаемо require и http.request
просто убедиться сколько раз он выполняется при звонке... и похоже в общей части require делать не стоит
Yuriy
просто убедиться сколько раз он выполняется при звонке... и похоже в общей части require делать не стоит
У вас выполняются 3 канала: -взходящий - новый созданный после answer - hangup соответсвенно вот ваши 3 раза - то есть по разу на каждого участника bridge
Snusmumriken
А там само ядро создаёт луа-стейты на каждый чих? Его нельзя пофиксить, на манер той же опенрести с async_io?
Yuriy
А там само ядро создаёт луа-стейты на каждый чих? Его нельзя пофиксить, на манер той же опенрести с async_io?
Там сама по себе архитектура сервиса не позволяет по нормальному создать luastate разово и просто релодить Это типа apache - на каждый запрос новый поток Пофиксить можно все, вопрос в человекочасах
Pavel
У вас выполняются 3 канала: -взходящий - новый созданный после answer - hangup соответсвенно вот ваши 3 раза - то есть по разу на каждого участника bridge
Хм.. Если поставить паузу после http.request видно что они выполняются последовательно и answer происходит после 3 вызова...
Yuriy
Хм.. Если поставить паузу после http.request видно что они выполняются последовательно и answer происходит после 3 вызова...
У вас сначала обработчики активируются, и потом только уже исполняется диалплан
Snusmumriken
Чо за асинкио в рести?
Ну там типа открывается всего несколько луастейтов на всё, и эти луастейты очень быстро переключаются между задачами, в моменты простоя (чтение сокетов, запись на диск).
Snusmumriken
И они держатся пока сервер не завершит работу.
Anonymous
А там используется кооперативный мультитаскинг нжинкса что-ли?
Snusmumriken
Ага
Anonymous
Это хорошее решение
Yuriy
в nignx вообще на сколкьо я помнб даже сокеты используются обстрактные nginx-ковые (cosokets по-моему), соответсвенно они и не блокирующие получаются.
Snusmumriken
Ну, это очевидно абстракция над осевыми сокетами, но да, оно сделано так чтобы быть зашибись.
Yuriy
Ну, это очевидно абстракция над осевыми сокетами, но да, оно сделано так чтобы быть зашибись.
Ну естессно над осевыми) я к тому что не используется lua-sockets там Но в общем то это так. чисто для расширения данной инфомрации. Отрицательной нагрузки мое повествование не несет 😊
Pavel
У вас сначала обработчики активируются, и потом только уже исполняется диалплан
Тогда может профита в Lua-кофниге перед AGI на том-же Lua и нет?
Yuriy
Тогда может профита в Lua-кофниге перед AGI на том-же Lua и нет?
есть Он вполне быстрый и более гибкий, а самое главное читабельный чем обычный extensions.conf AGI умеет далеко не все но вообще каждый использует то, что удобнее ему НО extensions.lua надо использовать с умом и пониманием того как работает астериск
Alexey
В астериске и Freeswitch динамическое создание тредов на каждый новый звонок. Поэтому запуск luastate происходит в каждом вновь созданном потоке (которые генерится для каждого нового звонка). nginx и kamailio сделаны по другому. Там luastate запускается один раз при старте на каждый поток - воркер, которые запускаются как пул в начале. соответсвенно и luastate запускается один раз
Во freeswitch для маршрутизации создается один поток пер профиль. Для сигналки - отдельные. Плюс для разных команд могут создаваться еще дополнительные потоки. Но для каждого вызова Lua создается отдельный стейт и в него загружаются все библиотеки заново. Даже для EventHandler
Pavel
Как-нибудь из программного кода можно получить имя пакета? json = require('json') Узнать, это luajson, lua-json? ._NAME не у всех модулей есть.
Snusmumriken
Изнутри самого пакета — local requiredname = ... Если тут nil — модуль вызван самостоятельно.
halt
Парни, вопрос. А можно ли перенести строку кода если нет пробелов? Типа такого... /tts?format=mp3&quality=hi&platform=web&application=translate&lang=ru_RU&speaker=ermil&emotion=good&...... А то строка шибко длинная и выходит из видимости
halt
типа "bla-bla-bla" .. .. "bla-bla-bla" ?
mva
типа "bla-bla-bla" .. .. "bla-bla-bla" ?
достаточно одной пары точек
halt
Спасибо. Сработало
fgntfg
ipairs
Denis
pairs даст тебе все ключи
Highly Likely
Pairs
Highly Likely
Обычно дает, но это UB емнип
Highly Likely
Читай про next()
Highly Likely
Емнип так и есть
Snusmumriken
Вот примерно так работает pairs. local key, value = next(tbl) while key do .. do stuff key, value = next(tbl, key) end
Highly Likely
Ну и формально, дырки могут быть только в линейном массиве
Snusmumriken
Но самый главный прекол — вот в этом. Цикл for .. in — сам сохраняет промежуточные состояния и посылает их в функцию итератор.
Highly Likely
https://www.lua.org/source/5.3/ltable.c.html
Highly Likely
Это если совсем скучно станет :)
Highly Likely
Highly Likely
Highly Likely
@zarif_li :)
Highly Likely
Довольно приятные исходники у Луа
🐅🤦‍♂️
Имеет смысл писать для tcp соединения такой код отправки и приема? Типа сокет отправил не до конца данные, пробую доотправить. function sendData(sock, s) local totalsent = 0 while totalsent < #s do local size, err, last = sock:send(string.sub(s, 1 + totalsent, #s)) if err then return false, err end totalsent = totalsent + size end return true end