Сергей
Спасибо за помощь, буду тогда встраивать её
Snusmumriken
А ещё, кстати, у них наверняка есть линия поддержки. Такие виртуальные кассы обычно берут некоторую мзду за использование, и им крайне выгодно чтобы народ к ним подключался, за этим их и создавали. Это если у тебя будут какие-то вопросы. Всё таки я сомневаюсь что разработчики интеркассы сидят в этом чате.
Snusmumriken
Идея-то хорошая, но недостатка в средствах не испытываю. Уже успел подвергнуться всучиванию биткоинов в качестве оплаты за сравнительно небольшую помощь, и мне не понравилось. Зато успел в первый раз в жизни купить чот за биткоины.
Lucky
Только кошерные акции МММ!
Snusmumriken
50/50. Карма — такая штука, что без платы ты сажаешь народ себе на шею и развращаешь "бесплатной работой", и они начинают думать что это норма, и твоя карма снижается.
Lucky
Попробовал запихнуть крутилку пикселей в корутину. Профита не заметил. Может я неправильно как-то это делаю?
Snusmumriken
Профита производительности?
Сергей
Карма это магический катализатор, который позволяем использовать заклинание “ТЫЖПРОГРАММИСТ“
Snusmumriken
Ну дык корутины несут производительность в том случае, если ты пользуешься неблокирующими операциями, которые обычно блокируют.
Snusmumriken
Допустим ты такой качаешь файлы сокетами: local files = {url1, url2} for i, v in ipairs(files) do files[i] = http.request(v) end Вот тут мы такие последовательно скачиваем файлы без корутин.
Snusmumriken
И это медленно, потому что 90% затраченного времени — ожидание ответа от другой стороны соединения. Мы могли бы начать скачивать сразу все файлы, открыв на каждое по неблокирующему соединению, запихнув в корутину.
Snusmumriken
Ещё можно было бы с помощью корутины разбить твою крутилку пикселей на несколько коротких этапов, и разбить выполнение функции на несколько кадров, не блокируя ввод. Типа: 1. Сделали кусочек работы 2. Обработали ввод 3. Нарисовали гуй 4. goto 1 Чтобы на длинных операциях не блокировать гуй, сохранив отзывчивость, и визуально повысив производительность (убрав пролаги интерфейсов на длинных операциях).
Snusmumriken
Так-то корутины не выполняются параллельно, для параллельности нужна многопроцессорность (тру многопоточка).
Lucky
Погодь, кажется, начинаю понимать - разделить картинку на части и просчитывать каждую часть в отдельной корутине?
Lucky
И. пожалуй, с разным разрешением, тоже можно.
Snusmumriken
Не, разделить длинную операцию на несколько. Ну там: function factorial(value) local n = 1 for i = 2, value do n = n * i if i % 1000 then coroutine.yield() end end return n end А потом, если тебе надо посчитать очень большие факториалы которые долго считаются — ты несколько раз вызываешь корутину с этой функцией каждый кадр, пока не получишь результат. Чтобы интерфейсы не лагали. В твоей крутилке пикселей — обернуть в корутину функцию обработки нескольких тысяч пикселей, и вызывать её каждый кадр, пока не обработается.
Lucky
Только я пока не соображу, как в коде это описать - новая концепция просто так не укладывается в ум.
Lucky
А ещё такой вопрос - как повторно запустить корутину?
Snusmumriken
А для производительности — возьми, например, lua lanes, и шли сообщеньки между потоками: — Эй, дочерний поток, тут есть картинка которую надо обработать. — Окс. — Ну что там, уже готово? — Не, считаю пока. — А теперь? — Ага, во, держи обработанную картинку.
Lucky
Вот она досчитала до конца картинку и мне надо дёрнуть её ещё раз с другими данными.
Snusmumriken
Создавай новую корутину или сделай внутри корутины бесконечный цикл.
Snusmumriken
Нет конечно ))
Snusmumriken
Это сторонняя библиотека, но она даёт многопроцессорную многопоточность. Можно загрузить все физические ядра твоего компутера и получить прям прирост производительности.
Lucky
Спасибо, гляну!
Snusmumriken
В общем, если тебе больше нравится такое описание, то корутины это как будто много goto. Твоя функция сделала часть работы и делает goto наружу (yield), в то место где её вызвали. Оттуда её могут вызвать ещё раз, переместившись в точку последнего goto из функции. Просто так, куча goto физически не может заставить код работать быстрее.
Snusmumriken
Использовал, я в основном пишу под венду.
Igor
LuaLanes в связке с житом позволяет довольно таки мощные вещи делать
Snusmumriken
Прост у лейнсов есть косячки (например, она пытается по дефолту копировать в новый стейт все значения стейта-создателя, и иногда ломается на юзердате), но это чуть ли не единственная норм кроссплатформенная либа многопоточки.
Snusmumriken
Можно, да, просто инициализируем пустой стейт без либ.
Лепикоршев
Я его просто только под линуксом задействовал, поэтому интересно любимый инструмент перенести на винду. С точки зрения того, чтобы код в итоге был кроссплатыономенным
Snusmumriken
У меня так однажды на работе электричество вырубилось, потому что на куче серверов запустили сразу тонну многопоточных луёвых серверов и проводка не справилась.
Лепикоршев
А обертку типа легковесных денных над юзердата перед передачей кто-нибудь пробовал?
Igor
Можно, да, просто инициализируем пустой стейт без либ.
Не помню, на какой версии луёв, но у меня случалось так, что я инициализировать стейт в lualanes не мог так, чтобы в нём были только нужные мне библиотеки
Лепикоршев
Была идея, что так модно устранить "слом" передачи юзердата
Igor
Я, например, пытался инициализировать стейт с библиотекой base только, чтобы с помощью require уже внутри все свои дела делать
Igor
Но почему-то внутри потока функция require уже не существовала
Igor
Например, выделяется внутри потока char массив, потом кастуется в intptr и передаётся луёвым числом в основной поток и там уже обратно в char массив превращается
Snusmumriken
Я, например, пытался инициализировать стейт с библиотекой base только, чтобы с помощью require уже внутри все свои дела делать
Таки при создании нового стейта со звёздочкой lanes.gen("*", func), это вливает в свежесозданный стейт всю стандартную библиотеку. Ещё require, помнится, можно выудить через lanes.require внутри нового стейта.
Igor
ну я вместо звёздочки пытался base писать, потому что что-то такое в документации находил
Snusmumriken
Оно тоже должно добавить require, так что странно.
Igor
Должно-то должно, но он инициализировал вообще пустой стейт, без print, require, table, math, ...
Snusmumriken
Глюк. Во, ещё у меня было веселье, когда пришлось впихивать в lanes корутины, для ограничения времени работы. Допустим, есть шедулер задач, и нужно чтобы каждая задача выполнялась ограниченное количество времени, и просто отваливалась если не успела. Таймауты и уничтожения потоков в лейнсах работают так, что фактически в луёвый байткод стейта вставляются дополнительные инструкции проверок "а не хотят ли нас завершить", и пока поток заблокирован чем-то типа того же сишного хттп-запроса — оно ничего не проверяет и блокирует поток по настоящему, не давая его удалить до завершения запроса. Поэтому пришлось оборачивать в корутины обычные хттп-запросы и всякое такое блокирующее io, чтобы потоки завершались )) Нет, можно было и просто "забывать" про то что у нас есть такая таска, но количество хендлеров росло и вся прога просто падала ))
Лепикоршев
Глюк. Во, ещё у меня было веселье, когда пришлось впихивать в lanes корутины, для ограничения времени работы. Допустим, есть шедулер задач, и нужно чтобы каждая задача выполнялась ограниченное количество времени, и просто отваливалась если не успела. Таймауты и уничтожения потоков в лейнсах работают так, что фактически в луёвый байткод стейта вставляются дополнительные инструкции проверок "а не хотят ли нас завершить", и пока поток заблокирован чем-то типа того же сишного хттп-запроса — оно ничего не проверяет и блокирует поток по настоящему, не давая его удалить до завершения запроса. Поэтому пришлось оборачивать в корутины обычные хттп-запросы и всякое такое блокирующее io, чтобы потоки завершались )) Нет, можно было и просто "забывать" про то что у нас есть такая таска, но количество хендлеров росло и вся прога просто падала ))
??? Какая-то сильна сложная конструкция получилась. Почему не добавить в функцию потока обработку сообщения "kill" и не кидать такое сообщение, когда ходим убить поток?
Snusmumriken
Поток будет продолжать висать пока хттп-запрос не выполнится полностью.
Лепикоршев
Можно вместо строчки kill через cancel кидать сигнал
Snusmumriken
Можно, но там ровно та же ситуация ))
Лепикоршев
Поток будет продолжать висать пока хттп-запрос не выполнится полностью.
Ок, если поток не хочет обрабатывает сигнал, ввлим его наглухо =)
Snusmumriken
Это виндовс, тут нет таких сигналов. Точнее, может и есть, но нужно ещё чего-то подрубать.
Лепикоршев
True, - 1, 3 (или как-то так) в качестве аргументов в cancel - и все умерли
Snusmumriken
Не а, не работает под вендой )) Я уже пробовал. Хендлер потока продолжает висеть пока запрос не завершится.
Лепикоршев
Хедер ты вручную в родительском потоке удаляешь же
Snusmumriken
Хендлер.
Snusmumriken
Вот такая штука. У венды всё на хендлерах.
Лепикоршев
После того, как статус станет Done, stopped, error, и т.д.
Snusmumriken
Он не меняется до полного выполнения блокирующей операции )) Как раз статус проставляется дополнительными инструкциями в луёвом коде на стороне дочернего стейта. Если луёвые инструкции в дочке не идут — ничего не меняется, не принимается и не отдаётся.
Лепикоршев
А, типа, дескриптор берёшь в потоке, а после смерти потока он не освобождается?
Snusmumriken
Кароч, пока идёт какой-нибудь хттп-запрос или длинная сишная операция — поток замерзает полностью. Он никак, вообще не меняется и не завершается, что бы с ним ни делали. Нужно чтобы попёрли луёвые инструкции. Во время длинного sleep'а — тоже.
Лепикоршев
И нужна корутина, чтобы перехватить управление изнутри, и освободить ресурсы?
Snusmumriken
Дыа.
Лепикоршев
Дыа.
Прикольная проблема. Надо подумать))
Лепикоршев
А ещё сперва лэйнс поставить под винду
Snusmumriken
Можно и не корутиной, а чем-то типа: function HttpRequest(...) local hnd = Request(..., async = true) while not hnd.done do -- внутри этого цикла lanes сама -- влепит проверки завершения треда sleep(.02) end return hnd end Но я мутил корутины.
Lucky
запихнул вычисления пикселей в бесконечный цикл, вычисления в корутину - вроде то, что надо.
c
визуал цппшный signal.h его и использует
Pavel
Здрасте. подскажите, есть ли в экосистеме lua что-то гисовое или хотя бы геометрическое? или на худой конец живые биндинги к gdal/geos? чтобы умело всякое point-in-polygon, intersects и прочее. в гугле не банили, но ничего внятного не нашёл.