
Pavel
02.03.2017
15:31:49
День добрый, уважаемые, а не подскажите маленькую библиотеку таймера для Lua? Задача-раз в секунду получать данные. Os.sleep мне как то не хочется использовать, а вот простой библиотеки что-то не нарыл. Так что если что - потыкайте носом :). Это, собственно, планируется телеграмм бот на лонг поллинге.

Snusmumriken
02.03.2017
16:38:58
Хм.
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

Tverd
02.03.2017
16:41:23
как-то не очень...

Snusmumriken
02.03.2017
16:41:45
Ну щито поделать :3
В lua нет нормального sleep.
Разве что os.execute'ping 127.0.0.1'

Google

Tverd
02.03.2017
16:42:01
писать нормальный синглтон таймера

Snusmumriken
02.03.2017
16:42:13
Это не синглтон же.
Можно сделать много таймеров.

Pavel
02.03.2017
16:42:19
Ну вот именно os.... мне бы и хотелось избежать...?

Tverd
02.03.2017
16:42:22
это понятно
libev

Snusmumriken
02.03.2017
16:43:08

Pavel
02.03.2017
16:44:03
Так я хочу возвести таймер, и по его истечении обратным вызовом вернуть curl, например

Vlad
02.03.2017
16:44:17
https://wiki.inspired-lua.org/timer.start

Snusmumriken
02.03.2017
16:44:39
Если у тебя есть luajit - можно так:
local ffi = require("ffi")
ffi.cdef[[
void Sleep(int ms);
int poll(struct pollfd *fds, unsigned long nfds, int timeout);
]]
local sleep
if ffi.os == "Windows" then
function sleep(s)
ffi.C.Sleep(s*1000)
end
else
function sleep(s)
ffi.C.poll(nil, 0, s*1000)
end
end
sleep(0.01)

Tverd
02.03.2017
16:55:55
вообще-то если человек использует слип, то где-то он не правильно думает
это так, без обид )

Philipp
02.03.2017
16:57:19
Пока что ни разу не было необходимости в слипе, как ни странно

Google

Philipp
02.03.2017
16:57:28
Я даже прикинуть толком не могу, где его заюзать
Но это так, мое скромное мнение :D

Tverd
02.03.2017
16:59:01
Правильнее будет юзать таймер, если с сокетами работаешь, то самый простой вариант - libev.
Ну относительно простой

Pavel
02.03.2017
17:06:09
Ос-виндоуз, curl-потому что openssl в винде не завелся

The Dude
02.03.2017
17:06:52

Мерлин
02.03.2017
17:07:09
питон

Snusmumriken
02.03.2017
17:09:03

Pavel
02.03.2017
17:09:31
А слип... ну не нравится мне такой ход. А взять другой язык, с готовым фейерверком для бритв можно, но не спортивно. Вот хочется мне бота на Lua написать для себя. Да, это как в гамаке на лыжах, но хочется

Snusmumriken
02.03.2017
17:09:35
Правда, придется чуть прописать path/cpath

The Dude
02.03.2017
17:10:17
Луа как отдельный язык - удел энтузиастов. Нужно уметь ввбирать инструмент под задачу.
А не забиватт гвозди микроскопом.

Tverd
02.03.2017
17:10:21

Pavel
02.03.2017
17:10:37
Я буду благодарен за рабочий luasec, и постараюсь разобраться

Snusmumriken
02.03.2017
17:11:06
Ах да, версия lua, надеюсь, 32-битная?

Pavel
02.03.2017
17:12:06
А пишу на луа, чтобы с ним разобраться, в дальнейшем использовать его в скриптах под линуксом для ембедед. Схемотехник я.

Snusmumriken
02.03.2017
17:12:24

Мерлин
02.03.2017
17:13:26

Google

Мерлин
02.03.2017
17:13:36
И сделай вот так
http://luajit.org/ext_ffi_tutorial.html

Pavel
02.03.2017
17:14:07
Ну вот насчет х32 я даже не знаю... и сейчас не могу глянуть. К сожалению. Винда точно х64
Короче, как я понял мой путь лежит через jit или ffi. Буду смотреть, спасибо, возможно, еще вернусь с кучей иных вопросов?

Snusmumriken
02.03.2017
17:18:27
Тут нет слипа. Эта штука ничего не блокирует.
Можно и до и после пихать любое количество кода. Оно просто работает раз в секунду. Правда, за счет того что os.time дает только секунды, получается выставлять таймеры только кратные секундам. С сокетами и gettime можно получить миллисекунды и делать чуть более сложную логику.
Хм.
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
'запускает функцию раз в секунду

Sergey
02.03.2017
17:26:00
@Snusmumriken можно использовать socket.gettime() - даёт миллисекунды.

Snusmumriken
02.03.2017
17:26:17
Уже написал на этот счет.

Sergey
02.03.2017
17:26:34
а

Pavel
02.03.2017
17:27:01
Не, я не сказал, что мне не нравится, наоборот, спасибо за все подсказки. Именно неблокирующий таймер мне и нужен, так что благодарю

Snusmumriken
02.03.2017
17:28:10

Pavel
02.03.2017
17:28:40
Спасибо заранее

Tverd
02.03.2017
17:29:06
тоже посмотрел бы

Snusmumriken
02.03.2017
17:36:27
Спасибо заранее
В ООП и лямбды ещё не лез?
ООП позволяет делать разные функциональные девайсы, а лямбды - сделать девайс с одной функцией, максимально лаконично. Идеально для таймера.

Pavel
02.03.2017
17:38:12
Не, еще не лез... Я хочу обойтись малыми средствами

Snusmumriken
02.03.2017
17:50:31
Не, еще не лез... Я хочу обойтись малыми средствами
Вот та функция которая возвращается функцией - лямбда. Переменная time видна только лямбде, это называется замыкание.
То есть, функция которая имеет внутреннее состояние, и результат её вызовов зависит от дополнительных условий. В данном случае - от времени.
Большую часть времени она ничего не делает, и только раз в секунду вызывает колбек который в неё передали.

Pavel
02.03.2017
17:53:25
Ну мне проще понимать это как функции обратного вызова-ну или функции первого класса.

Snusmumriken
02.03.2017
17:54:26
Ну, колбеком тут является функция которую мы передали в таймер.
Ссылка на неё, кстати, тоже хранится в замыкании.

Google

Sergey
02.03.2017
17:56:42
А os.time() - это столовая функция, потомучто находится в столе os.

Snusmumriken
02.03.2017
18:05:47
Столы :3
Почему именно столы, кстати?
Это сложный юмор?

Sergey
02.03.2017
18:07:40
Как же. Где-то у меня была картинка, которая олицетворяет собой весь Lua.

Мерлин
02.03.2017
18:08:41
"Луа. Если разработчики предусмотрели это, то вы сделаете это в три строки. Если нет - то сколько ни бейся, ничего у тебя не выйдет"

Snusmumriken
02.03.2017
18:09:03
Прострел ноги.
Это про стрельбу по ногам.
И ящитаю что это комплимент.

Sergey
02.03.2017
18:10:14

Snusmumriken
02.03.2017
18:11:12
Сложно.

Sergey
02.03.2017
18:13:27
На англ конечно эта картинка лучше звучит.

Snusmumriken
02.03.2017
18:51:48

yegorf1
02.03.2017
18:53:10
Ааааа

Admin
ERROR: S client not available

yegorf1
02.03.2017
18:53:21
Так нельзя делать

Snusmumriken
02.03.2017
18:54:57

yegorf1
02.03.2017
18:55:04
while true такой

Snusmumriken
02.03.2017
18:55:13
Эмм. Это пример.
Внутри таймера немножко не так.

yegorf1
02.03.2017
18:56:03
ладно
но без слипа нельзя делать такие вещи

Snusmumriken
02.03.2017
18:56:37
Ты упоролся? :3
Задача - показать как работает а не "сделать супер-грамотно".
Это не рабочий пример а тестовый.
Про слип и так все в курсе. Наверное.
В большей части моего ПО с бесконечными циклами есть слип на ~0.000001, шоб комп не перегружать.
И дело не в бесконечном цикле а в вызове функции даже с аргументами по таймеру.
Нанотехнологично же!
P.S. В луа нет слипа по умолчанию.
Вот такая вот беда.
Что ты предлагаешь взамен тем людям, у которых нет сокетов, ffi и либ для доступа к стандартной C-библиотеке (такие есть)?
Мне есть что предложить, но это не шибко красиво.

Alexander
02.03.2017
19:03:17
реальный код из моего телеграм-бота

Google

Alexander
02.03.2017
19:04:31
в вашем случае можно nil вместо {server}
выход на select есть в куче разных библиотек, мне больше всего удобен lsocket

Snusmumriken
02.03.2017
19:05:46
в вашем случае можно nil вместо {server}
Человек пишет под венду.
Слип можно заменить чем-то вроде
os.execute'ping -n 2 127.0.0.1',
но тут только кратные секундам задержки, проще через os.time.
Если ты последователь unix-way - то в твоих интересах делать универсальные методы, которые работают вне операционной системы и (желательно) подключенных библиотек.
Кстати, не советую использовать слово select, ибо это команда в lua.

Tverd
02.03.2017
19:09:58

Snusmumriken
02.03.2017
19:10:23
Жертвуй производительностью ради переносимости

Tverd
02.03.2017
19:10:32
то есть если библиотеку делать и под луа и под луаджит, то сильно не пооптимизируешь )

Snusmumriken
02.03.2017
19:11:14
Ну как тебе сказать.
Если библиотеку делать под венду и под линекс - можно сделать адаптеры для венды и для линекса, и обоптимизироваться в усмерть для каждой оси. Аналогично с jit/vanilla.

Tverd
02.03.2017
19:15:20
да можно, писать только придется в 2 раза больше )

Snusmumriken
02.03.2017
19:16:35
Угу, а то и в четыре )))
Количество кода важно только в embedded-системах, в win/unix, как правило, довольно много памяти.
Вопрос - на что ты ориентируешься. На свои уникальные случаи или на людей, у которых могут быть совсем другие условия.
Ну, представь что luasocket работает только в юниксах, а lua-cjson - только в венде.
Тебе не было бы грустно, что или ты имеешь быстрые сокеты, но медленное (де)кодирование json средствами lua, или быстрый json но у тебя совсем нет сокетов?
Представь каким бы был мир, если бы люди ориентировались только на себя.

Tverd
02.03.2017
19:19:01
будем надеяться что не будем так много писать ))

Snusmumriken
02.03.2017
19:20:43
Ну, вот тебе прям на самом верху пример адаптера подключения функции sleep из венды и юникса.
http://luajit.org/ext_ffi_tutorial.html
Смотри как много лишнего кода. Тебе страшно?

Alexander
02.03.2017
19:22:07
я свои серверные решения пишу только под линух. мне так проще, и если что, виртуальной машины будет достаточно

yegorf1
02.03.2017
19:22:15
Сниф, а в ffi можно делать вставки на асме?

Snusmumriken
02.03.2017
19:24:06
https://luapower.com/dynasm
это не оно? я сильно не влазил
Снифф - тоже персонаж муми-троллей.
И он слева.
http://antifact.ru/upload/antifacts/00/00/18/18.png

yegorf1
02.03.2017
19:27:08
Ой
Снуф
Препутал)

Snusmumriken
02.03.2017
19:28:01
В общем, вставки на асме реальны через чуть отдельный биндинг dynasm и препроцессор.
А зачем тебе? :3

Tverd
02.03.2017
19:29:04
ну наверно по приколу ) просто сей за глаза обычно хватает )))

Snusmumriken
02.03.2017
19:30:01
Да, я сам в офигении "асм у скриптов".
Это какая-то феерия, а ля "делай чо хошь".