Tverd
это так, без обид )
Tverd
Правильнее будет юзать таймер, если с сокетами работаешь, то самый простой вариант - libev.
Tverd
Ну относительно простой
marroty
Ос-виндоуз, curl-потому что openssl в винде не завелся
Мерль
питон
Snusmumriken
marroty
А слип... ну не нравится мне такой ход. А взять другой язык, с готовым фейерверком для бритв можно, но не спортивно. Вот хочется мне бота на Lua написать для себя. Да, это как в гамаке на лыжах, но хочется
Snusmumriken
Правда, придется чуть прописать path/cpath
Tverd
marroty
Я буду благодарен за рабочий luasec, и постараюсь разобраться
Snusmumriken
Snusmumriken
Ах да, версия lua, надеюсь, 32-битная?
marroty
А пишу на луа, чтобы с ним разобраться, в дальнейшем использовать его в скриптах под линуксом для ембедед. Схемотехник я.
Snusmumriken
Snusmumriken
Мерль
Мерль
И сделай вот так
http://luajit.org/ext_ffi_tutorial.html
marroty
Ну вот насчет х32 я даже не знаю... и сейчас не могу глянуть. К сожалению. Винда точно х64
marroty
Короче, как я понял мой путь лежит через jit или ffi. Буду смотреть, спасибо, возможно, еще вернусь с кучей иных вопросов😂
Snusmumriken
Тут нет слипа. Эта штука ничего не блокирует.
Можно и до и после пихать любое количество кода. Оно просто работает раз в секунду. Правда, за счет того что os.time дает только секунды, получается выставлять таймеры только кратные секундам. С сокетами и gettime можно получить миллисекунды и делать чуть более сложную логику.
Snusmumriken
Хм.
function timer(func)
local time = os.time()
return function()
if os.time() ~= time then
time = os.time()
func()
end
end
end
updater = timer(receive_and_process_data_function)
while true do updater() end
Snusmumriken
'запускает функцию раз в секунду
Sergey
@Snusmumriken можно использовать socket.gettime() - даёт миллисекунды.
Snusmumriken
Уже написал на этот счет.
Sergey
а
marroty
Не, я не сказал, что мне не нравится, наоборот, спасибо за все подсказки. Именно неблокирующий таймер мне и нужен, так что благодарю
Snusmumriken
marroty
Спасибо заранее
Tverd
тоже посмотрел бы
Snusmumriken
Спасибо заранее
В ООП и лямбды ещё не лез?
ООП позволяет делать разные функциональные девайсы, а лямбды - сделать девайс с одной функцией, максимально лаконично. Идеально для таймера.
marroty
Не, еще не лез... Я хочу обойтись малыми средствами
Snusmumriken
Не, еще не лез... Я хочу обойтись малыми средствами
Вот та функция которая возвращается функцией - лямбда. Переменная time видна только лямбде, это называется замыкание.
То есть, функция которая имеет внутреннее состояние, и результат её вызовов зависит от дополнительных условий. В данном случае - от времени.
Большую часть времени она ничего не делает, и только раз в секунду вызывает колбек который в неё передали.
marroty
Ну мне проще понимать это как функции обратного вызова-ну или функции первого класса.
Snusmumriken
Ну, колбеком тут является функция которую мы передали в таймер.
Snusmumriken
Ссылка на неё, кстати, тоже хранится в замыкании.
Sergey
А os.time() - это столовая функция, потомучто находится в столе os.
Snusmumriken
Столы :3
Почему именно столы, кстати?
Это сложный юмор?
Sergey
Как же. Где-то у меня была картинка, которая олицетворяет собой весь Lua.
Мерль
"Луа. Если разработчики предусмотрели это, то вы сделаете это в три строки. Если нет - то сколько ни бейся, ничего у тебя не выйдет"
Snusmumriken
Прострел ноги.
Это про стрельбу по ногам.
И ящитаю что это комплимент.
Sergey
Snusmumriken
Сложно.
Sergey
На англ конечно эта картинка лучше звучит.
Snusmumriken
Хе-хе-хе. Даже с аргументами.
Yogurt
Ааааа
Yogurt
Так нельзя делать
Snusmumriken
Раздача слонов. Тут таймер, сокеты и ssl. Инструкция в readme.
Snusmumriken
Yogurt
while true такой
Snusmumriken
Эмм. Это пример.
Внутри таймера немножко не так.
Yogurt
ладно
Yogurt
но без слипа нельзя делать такие вещи
Snusmumriken
Ты упоролся? :3
Задача - показать как работает а не "сделать супер-грамотно".
Это не рабочий пример а тестовый.
Про слип и так все в курсе. Наверное.
В большей части моего ПО с бесконечными циклами есть слип на ~0.000001, шоб комп не перегружать.
И дело не в бесконечном цикле а в вызове функции даже с аргументами по таймеру.
Нанотехнологично же!
P.S. В луа нет слипа по умолчанию.
Вот такая вот беда.
Что ты предлагаешь взамен тем людям, у которых нет сокетов, ffi и либ для доступа к стандартной C-библиотеке (такие есть)?
Мне есть что предложить, но это не шибко красиво.
Alexander
Alexander
реальный код из моего телеграм-бота
Alexander
в вашем случае можно nil вместо {server}
Alexander
выход на select есть в куче разных библиотек, мне больше всего удобен lsocket
Snusmumriken
в вашем случае можно nil вместо {server}
Человек пишет под венду.
Слип можно заменить чем-то вроде
os.execute'ping -n 2 127.0.0.1',
но тут только кратные секундам задержки, проще через os.time.
Если ты последователь unix-way - то в твоих интересах делать универсальные методы, которые работают вне операционной системы и (желательно) подключенных библиотек.
Кстати, не советую использовать слово select, ибо это команда в lua.
Tverd
Snusmumriken
Жертвуй производительностью ради переносимости
Tverd
то есть если библиотеку делать и под луа и под луаджит, то сильно не пооптимизируешь )
Snusmumriken
Ну как тебе сказать.
Если библиотеку делать под венду и под линекс - можно сделать адаптеры для венды и для линекса, и обоптимизироваться в усмерть для каждой оси. Аналогично с jit/vanilla.
Tverd
да можно, писать только придется в 2 раза больше )
Snusmumriken
Угу, а то и в четыре )))
Количество кода важно только в embedded-системах, в win/unix, как правило, довольно много памяти.
Вопрос - на что ты ориентируешься. На свои уникальные случаи или на людей, у которых могут быть совсем другие условия.
Snusmumriken
Ну, представь что luasocket работает только в юниксах, а lua-cjson - только в венде.
Тебе не было бы грустно, что или ты имеешь быстрые сокеты, но медленное (де)кодирование json средствами lua, или быстрый json но у тебя совсем нет сокетов?
Представь каким бы был мир, если бы люди ориентировались только на себя.
Tverd
будем надеяться что не будем так много писать ))
Snusmumriken
Ну, вот тебе прям на самом верху пример адаптера подключения функции sleep из венды и юникса.
http://luajit.org/ext_ffi_tutorial.html
Смотри как много лишнего кода. Тебе страшно?
Alexander
я свои серверные решения пишу только под линух. мне так проще, и если что, виртуальной машины будет достаточно
Yogurt
Сниф, а в ffi можно делать вставки на асме?
Snusmumriken
https://luapower.com/dynasm
это не оно? я сильно не влазил
Snusmumriken
Снифф - тоже персонаж муми-троллей.
И он слева.
http://antifact.ru/upload/antifacts/00/00/18/18.png
Yogurt
Ой
Yogurt
Снуф
Yogurt
Препутал)
Snusmumriken
В общем, вставки на асме реальны через чуть отдельный биндинг dynasm и препроцессор.
А зачем тебе? :3
Tverd
ну наверно по приколу ) просто сей за глаза обычно хватает )))
Snusmumriken
Да, я сам в офигении "асм у скриптов".
Это какая-то феерия, а ля "делай чо хошь".
Alexander
я несколько драйверов устройств для ядра линуха писал, но даже там асм не нужен )
скорее пригодился пару раз, когда разбирал, что за херня привела к падению юзерспейс программы
Alexander
то есть пригодилось понимание, но самому писать ничего не надо было