@ProLua

Страница 58 из 307
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
Ну вот именно os.... мне бы и хотелось избежать...?
В чём проблема? Это стандартная библиотека, а времени без неё нормально не получишь. os.time возвращает кол-во секунд с 1970 года.

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)

Так я хочу возвести таймер, и по его истечении обратным вызовом вернуть curl, например
Ты curl используешь для https? На какой ос работаешь/для какой пишешь?

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
Ос-виндоуз, curl-потому что openssl в винде не завелся
Возьми язык с норм стандартной библиотекой

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

Snusmumriken
02.03.2017
17:09:03
Ос-виндоуз, curl-потому что openssl в винде не завелся
Я могу скинуть luasec который завёлся.

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
Луа как отдельный язык - удел энтузиастов. Нужно уметь ввбирать инструмент под задачу.

А не забиватт гвозди микроскопом.

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

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

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

'запускает функцию раз в секунду

Короче, как я понял мой путь лежит через jit или ffi. Буду смотреть, спасибо, возможно, еще вернусь с кучей иных вопросов?
Я просто плохо понимаю что тебя не устраивает :3 Тут обычный неблокирующий таймер с колбеком и без слипов, все как ты хотел.

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
Не, я не сказал, что мне не нравится, наоборот, спасибо за все подсказки. Именно неблокирующий таймер мне и нужен, так что благодарю

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-библиотеке (такие есть)? Мне есть что предложить, но это не шибко красиво.

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.

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
Да, я сам в офигении "асм у скриптов". Это какая-то феерия, а ля "делай чо хошь".

Страница 58 из 307