Александр
Arslan
Alexander
Вот, разобрался, всем спасибо 😌 Никаких инжектов вроде
$lua = new Lua();
$lua->eval(/** @lang Lua */ <<<LUA
function sandbox(code)
local scope = loadstring(code)
local userEnv = {
loadstring = loadstring,
print = print,
pairs = pairs,
}
userEnv._G = userEnv
setfenv(scope, userEnv) -- для >= 5.2 нужен полифилл
return scope()
end
LUA);
$userCode = /** @lang Lua */ <<<LUA
for k in pairs(_ENV) do
print(k, "\\n")
end
LUA;
echo $lua->call('sandbox', [$userCode]);
Alexander
Snusmumriken
local str = [[
многострочная
строка
]]
local str = [=[
многострочная строка
с [[двойными скобками]] внутри
]=]
Александр
Alexander
Alexander
Snusmumriken
А, возможно. Ну тут указание энвайрнмента для отдельной функции.
Snusmumriken
Я вот понял.
Но вообще странно.
аннлн
11.0000000003
аннлн
пшш
аннлн
тут есть кто-то:
а) живой
б) кто сталкивался с многопоточностью в Lua (и многопоточностью как таковой)
?
Arslan
Оригинально
аннлн
аннлн
ещё можно живых людей с опытом разработки C extensions для луи.
Highly Likely
Highly Likely
Ну, хочешь многопоточку в Луа – запускай несколько луастейтов :)
аннлн
ага, класс
аннлн
и тут перед нами два стула
Highly Likely
А для многозадачности есть корутины
аннлн
на первом — luaL_newstate() и невозможность переносить стек между состояниями
аннлн
на втором — lua_newthread() — и крайне интересные подводные камни, с которыми я уже два дня не могу справиться
аннлн
подводные камни выглядят как рандомные сегфолты
аннлн
причём только при высокой нагрузке (скажем, 10000 запросов в секунду на простенький http-сервер)
Snusmumriken
Есть готовые решения для самих луёв, вроде lua lanes.
аннлн
ну тогда уж cstates
аннлн
но нет
аннлн
как вообще дебажить сишные модули?
gdb почти ничего не видит
аннлн
пс
Snusmumriken
Ща восстановлю
Snusmumriken
https://pastebin.com/n50ipjBt
аннлн
оно какбэ даже работает
Snusmumriken
Ничоси хаки ))
аннлн
чойта
Snusmumriken
weakref
аннлн
где-то нагуглилось, насколько помогает — без понятия
аннлн
вообще, помогает collectgarbage("stop"), но ненадолго
аннлн
примерно минут на пять стресс-теста
аннлн
потом приходит дядя oomkiller
🐅🤦♂️
pthread - это вроде потоки ядра?
🐅🤦♂️
ага, ок)
Snusmumriken
Да, это тяжёлые потоки.
аннлн
Snusmumriken
так, а как надо?
Тебе достаточно условно 1-16 тяжёлых потоков на все 10ккккккккк rps. Сколько у тебя ядер на компе минус один.
аннлн
Snusmumriken
Конечно : )
Snusmumriken
А при наличии блокирующего — процессор начинает метаться между тяжёлыми потоками, недоделывает их, мечется на другие и тратит безумное количество времени чисто на свитчи.
Snusmumriken
Так что обрабатывать на одном ядре в один поток оказывается тупо быстрее чем условно на четырёх, если ты открыл пару сотен потоков ))
аннлн
Snusmumriken
Как работают тяжёлые потоки (потоки ядра)?
Snusmumriken
Есть таск-шедулер встроенный в ОС. Он переключает ядро процессора между задачами. Процесс переключения — довольно медленный (много наносекунд, ибо запоминание, свитч стека/кеша и ещё много чего).
аннлн
если ничего не путаю, то pthreads как раз использует легкие треды
Snusmumriken
А лёгкие треды — это корутины ))
Snusmumriken
Считай что очень много goto в прямом коде, исполняющемся в одном потоке. Никакой многопроцессорности.
аннлн
что-то мне подсказывает, что I/O планировщик в линуксе умнее меня
аннлн
но это не точно
Snusmumriken
Так что если ты видишь "многопроцессорность" — это точно дёрганье тяжёлых тредов ОС, которые медленно создаются, медленно удаляются и медленно переключаются.
аннлн
к сожалению, нормальных неблокирующих сокетов в луа не подвезли
Snusmumriken
И нагруженных тяжёлых тредов не должно быть больше чем ядер проца минус один (потому что одно из ядер типа занято переключениями, всякими ОС-штуками, приёмом сокетов и ещё много чего)
Snusmumriken
А что конкретно ты хочешь?
Snusmumriken
Возьми OpenResty. Там все задачи решены.
аннлн
лол
аннлн
с него и бегу
Snusmumriken
Чего это? ))
Snusmumriken
Ну хорошо, тогда luvit:
https://luvit.io/
аннлн
тыкал
аннлн
правда, отдельно libuv
аннлн
при нагрузке память превращается в кашу
Snusmumriken
А ты плоди меньше объектов. Переиспользуй. Меньше размечай память в рантайме.
аннлн
есть, собственно, одно рабочее решение
аннлн
называется tarantool
аннлн
но это зашквар и вообще мэйлру
Snusmumriken
есть, собственно, одно рабочее решение
Нет решения "я хочу писать жопой, и чтобы всё магически работало с космической скоростью" ))
Нагруженные штуки приходится писать как нагруженные штуки. Правил, которым приходится следовать — немного, но они есть.