26 (2021-05-24 11:10:27 отредактировано Андрей_)

Re: библиотека lua_share (обмен данными между скриптами lua)

toxa пишет:

исправил досадную ошибку c IPC, обновленный релиз тут: [url]https://github.com/untoxa/lua_share/releases/latest[/url]

Добрый день! Расскажите подробнее про lua_share_server.exe.
1) Я так понял он автоматом запускает одноименный lua. А в нем может быть использование вообще любого lua кода и сторонних библиотек, на примере того, как это сделано в вашем телеграм боте?
2) В боте он свой обычный функционал запускает уже в потоке RunThread("lua_share_server.lua"), а основной поток занимается ботом? Эта RunThread создает отдельный lua state и общение с ним возможно через этот же механизм lua_share?
3) Действительно ли ipc_telegram_bot.exe это переименованный lua_share_server.exe?
4) Можно пример программы на python или С\С# как взаимодействовать с lua_share_server.exe по тому же принципу, как из lua? Чтение\запись очередей..
5) Сейчас телеграм бот опубликован взаимоисключающим с новой lua_share. Можете его зарелизить в виде дополнения к lua_share? Наверно было бы логичнее в lua_share_server.lua запускать RunThread с ботом как плагин. А lua_share_server.exe как эдакий IPC сервер с подключаемыми через RunThread поточными модулями. В любом случае бот требует пересборки на новую версию lua_share с исправленной ошибкой (и там некие изменения были), а это означает и переход на 64bit всех его составных.
6) Можете заодно тогда пересобрать и либу и бота (как дополнения) уже для последнего quik на lua 5.4.1?

А так идея отличная. Будет жаль, если бот отпадет из-за невозможности использовать вместе с обновлением основной либы.

27

Re: библиотека lua_share (обмен данными между скриптами lua)

1. да
2. да. но нужно понимать, что эти треды независимые, у каждого своя независимая lua-машина. это сделано для того, чтобы не плодить большое количество exe-файлов (два). общение между этими lua-машинами происходит через ту же lua_share.
3. да. только lua5.1.dll это "standalone" lua, не из комплекта с квиком. по-этому все это собрано в отдельный каталог (ну и чтобы не создавать беспорядок)
4. можно. для этого нужно на C/C# или питоне (видимо, все же на си + биндинги) реализовать вот это: [url]https://github.com/untoxa/lua_share/blob/master/common/mmf_ipc.pas[/url] b и вот это: [url]https://github.com/untoxa/lua_share/blob/master/common/lua_buffers.pas[/url] ; можно так же скомпилировать этот код в виде dll и водключать их к своим программам на C или на чем угодно.
5. он не то чтобы взаимоисключающий, просто телеграм бот 32-х битный и собран со старой версией lua 5.1 и использует старые библиотеки openssl для старой 32-х разрядной lua.

вы можете взять новую 64-х битную lua_share для 5.3, standalone 64-х битную версию lua, и все библиотеки, которые нужны для работы телеграм бота. это правильный подход.

или можете взять старые исходники lua_share с github, собрать 32-х разрядную версию для 5.1 чтобы подложить в имеющийся бот, но поправить части из пункта 4 чтобы протокол обмена был совместимый (добавилась поддержка интов, если я не ошибаюсь). это не очень правильный подход, но тоже имеет право на жизнь.

28 (2021-05-24 17:28:52 отредактировано Андрей_)

Re: библиотека lua_share (обмен данными между скриптами lua)

toxa пишет:

5. он не то чтобы взаимоисключающий, просто телеграм бот 32-х битный и собран со старой версией lua 5.1 и использует старые библиотеки openssl для старой 32-х разрядной lua.

вы можете взять новую 64-х битную lua_share для 5.3, standalone 64-х битную версию lua, и все библиотеки, которые нужны для работы телеграм бота. это правильный подход.

или можете взять старые исходники lua_share с github, собрать 32-х разрядную версию для 5.1 чтобы подложить в имеющийся бот, но поправить части из пункта 4 чтобы протокол обмена был совместимый (добавилась поддержка интов, если я не ошибаюсь). это не очень правильный подход, но тоже имеет право на жизнь.

все равно нужно будет запускать либо бот, либо стандартный сервер. А почему именно так сделали с переименованием? А не просто как сервер + lua-расширение бот-кодом. Я об этом выше. А то, что dll standalone, не помешает работе буквального взятого и переименованного exe из сборки lua_share?

Я вчера пробовал что-то собрать, но опыта не хватает. Даже luarocks 64 bit не понял как настроить, там только исходники без install.bat и всё больше под юникс.. Это конечно отдельная тема. Вы могли бы по подобию того, как делали, обновить сборку бота на 64bit и lua 5.3? И раз сам сервер на дельфи, можно ли это сделать так, чтобы потом новый Lua подменялся dll-ками без пересборки exe? И такой же вопрос про сборку dll lua_share. Возможно ли их так оформить, чтобы новый lua к ним присоединялся простым копированием? Ну до тех пор, пока есть совместимость используемых фич, конечно..

29

Re: библиотека lua_share (обмен данными между скриптами lua)

Андрей_ пишет:

все равно нужно будет запускать либо бот, либо стандартный сервер. А почему именно так сделали с переименованием? А не просто как сервер + lua-расширение бот-кодом. Я об этом выше.

нет, не нужно. просто используйте бот как сервер. он умеет все что умеет сервер и еще дополнительно общаться с телеграмом.

30

Re: библиотека lua_share (обмен данными между скриптами lua)

Андрей_ пишет:

Вы могли бы по подобию того, как делали, обновить сборку бота на 64bit и lua 5.3? И раз сам сервер на дельфи, можно ли это сделать так, чтобы потом новый Lua подменялся dll-ками безе пересборки exe? И такой же вопрос про сборку dll lua_share. Возможно ли их так оформить, чтобы новый lua к ним присоединялся простым копированием? Ну до тех пор, пока есть совместимость используемых фич, конечно..

[url]http://luabinaries.sourceforge.net/download.html[/url]

сделать чтобы новый "lua подменялся dll-ками" нельзя, потому что меняются функции lua api. просто может перестать работать.

31 (2021-05-24 17:28:21 отредактировано toxa)

Re: библиотека lua_share (обмен данными между скриптами lua)

если не можете ничего собрать, то и не нужно. воспользуйтесь репомендованным способом. возьмите 64-битные бинарники lua5.3, выньте сервер, подложите к нему эту lua, получите отдельный, независимый от квика сервер. добавьте в него телеграм бот: lua код бота и что там еще ему не хватает.

32

Re: библиотека lua_share (обмен данными между скриптами lua)

toxa пишет:

если не можете ничего собрать, то и не нужно. воспользуйтесь репомендованным способом. возьмите 64-битные бинарники lua5.3, выньте сервер, подложите к нему эту lua, получите отдельный, независимый от квика сервер. добавьте в него телеграм бот: lua код бота и что там еще ему не хватает.

Я бы рад, но где мне для этого способа взять luasec, luasocket, и прочие dll бота на 64? Нету их в релизах на гитхабе. А собрать не получается.

33

Re: библиотека lua_share (обмен данными между скриптами lua)

ну, надо поискать, наверняка кто-то уже это собирал.

34

Re: библиотека lua_share (обмен данными между скриптами lua)

вот же, одна из первых ссылок в гугле: [url]https://forum.quik.ru/messages/forum10/message43008/topic4609/#message43008[/url]

35 (2021-05-26 01:35:44 отредактировано Андрей_)

Re: библиотека lua_share (обмен данными между скриптами lua)

toxa пишет:

вот же, одна из первых ссылок в гугле

Пробую подменять в вашем боте exe и все dll. 3 из этого, остальное из lua_share.
Остались libeay32.dll и ssleay32.dll. Это из OpenSSL?
Я скачиваю его дистрибутив отсюда Win64 OpenSSL v1.1.1k 63MB Installer.
[url]https://slproweb.com/products/Win32OpenSSL.html[/url]
И в нем таких нет. Просто удаляю пока.
Сейчас ошибка при запуске:
error: script loading failed: error loading module 'ssl.core' from file './scripts/ssl.dll':
        Не найден указанный модуль.

ssl.dll - из архива по вашей ссылке с форума. Как быть?
Вобщем конечно не удивительно, что все не заработает, если копировать файлы из разных мест. Вы, когда делали бота, наверно сделали проект, загрузили исходники, собрали единым образом. Вы не хотите обновить этот проект? Не выкинули же его.. Точнее даже не обновить, а просто пересобрать под 64, подложив новый lua..

UPDATE
Вместо ibeay32.dll и ssleay32.dll положил libcrypto-1_1-x64.dll и libssl-1_1-x64.dll.
Вроде заработал сервер, спасибо. Значит он теперь будет актуален до breaking change в lua_share, либо если вы в будущем новую либу соберете под 5.3 и можно будет подменить ею сервер ко всем этим сторонним dll.

36

Re: библиотека lua_share (обмен данными между скриптами lua)

какую либу-то я соберу под 5.3? ssl? она не моя... lua_share и так под 5.3 собрана. проверьте, если все работает, то можно заархивировать и положить куда-нибудь типа dropbox.

я не думаю, что в обозримом будущем поменяется протокол обмена ipc. ну разве что в lua еще встроенных типов добавят. smile

37 (2021-05-27 12:35:29 отредактировано Андрей_)

Re: библиотека lua_share (обмен данными между скриптами lua)

toxa пишет:

какую либу-то я соберу под 5.3?

Имею ввиду будущие версии lua_share собирать не только под будущие lua, но и под 5.3. Если такие будут )
Выложил сборку в тему бота.
Так вы все же собирали сопутствующие либы для бота или тоже искали бинарники?

38

Re: библиотека lua_share (обмен данными между скриптами lua)

я поясню. дело в том, что основная версия lua_share для lua 5.1 была 32-х разрядная. 64-х разрядная тоже собиралась, но никто ее не использовал. новый квик с lua 5.3 64-х разрядный, и основные сложности как раз с тем, что не все библиотеки имеются для x64 lua. но, ситуация улучшается. вот, без особых проблем нам удалось раскочегарить luasocket и libssl.

Андрей_ пишет:

Так вы все же собирали сопутствующие либы для бота или тоже искали бинарники?

я совершенно не заморачивался, погуглил в интернете "телеграм-бот на lua", а все библиотеки нашлись в сборке "lua for windows". я, конечно, мог это все собрать, но зачем? этот бот - просто интересная демонстрация возможностей lua_share, на которую я потратил пол-часа.

кстати, и на переход на lua 5.3 мы не то чтобы много времени убили в итоге, даже ничего из кода переписывать не пришлось.

кстати, хорошо работает в итоге? я-то сам не пользовался.

39 (2021-05-27 21:10:31 отредактировано Андрей_)

Re: библиотека lua_share (обмен данными между скриптами lua)

Хорошо работает. А почему не пользуетесь? Наконец-то нормальный способ уведомлений из квика. В дополнение к рассылке сделок и разных программных ворнингов перевел штатный механизм уведомлений, не имеющий колбека и даже доступа к таблице из lua, на фиктивные стоп заявки по нерабочему инструменту. С условием на цену по нужному. В итоге такие уведомления отлично работают и рассылаются.

А потоки, созданные RunThread как-то управляются при завершении основного? OnStop там не вызывается + join?
Это потоки с отдельной lua машиной. RunThread нельзя внутри квика использовать?
Вы не знете, почему в w32 не включили CreateThread? Чтобы можно было потоки в той же машине запускать, с собственной синхронизацией. Иногда не хватает. Или это не возможно?

40 (2021-05-27 23:25:12 отредактировано toxa)

Re: библиотека lua_share (обмен данными между скриптами lua)

вы удивитесь, но я и квиком-то не пользуюсь.

Андрей_ пишет:

А потоки, созданные RunThread как-то управляются при завершении основного? OnStop там не вызывается + join?

stop не вызывается, но зато там есть функция Terminated:
[url]https://github.com/untoxa/lua_share/blob/master/lua_share_server.dpr#L84-L85[/url]
так что когда вы завершаете lua_share_server то основной тред ждет пока все завершится. все, что называется, graceful. смотрите как проверяет необходимость завершения код телеграм бота.

rpc server при завершении lua_share_server убивается (сигнализирует, что пора выходить из ожидания) через вызов terminate_rpc_server() который экспортируется из lua_share_rpc.dll

Андрей_ пишет:

Вы не знете, почему в w32 не включили CreateThread? Чтобы можно было потоки в той же машине запускать, с собственной синхронизацией. Иногда не хватает. Или это не возможно?

ну, вот я делал такой концепт, но вообще треды в lua идея очень плохая: [url]https://github.com/untoxa/lua_threads[/url]
лучше запускать несколько отдельных скриптов и взаимодействовать через lua_share. вот, честно, лучший вариант. кто утверждает что треды и луа это хорошая идея - идиот. lua-машина по своей природе однопоточная.

41 (2021-05-29 15:37:20 отредактировано Андрей_)

Re: библиотека lua_share (обмен данными между скриптами lua)

Разобрался. И вернул exe его имя, а в main lua_share_server.lua добавил RunThread("telegram_bot.lua").
Пусть он создает все потоки плагинов.
А так же добавил os.execute('chcp 65001 >nul'), чтобы не использовать преобразование в OEM.

42

Re: библиотека lua_share (обмен данными между скриптами lua)

toxa пишет:

лучше запускать несколько отдельных скриптов и взаимодействовать через lua_share

Тогда можно сделать маршаллинг функций как объектов? Чтобы передавать их с аргументами в очередь на исполнение другому макросу в другой поток. Шерить код через require не удобно. А так будет вполне удобный асинхронный RPC внутри квика.

43

Re: библиотека lua_share (обмен данными между скриптами lua)

Андрей_ пишет:

Тогда можно сделать маршаллинг функций как объектов?

да вы смеетесь что ли? smile

44 (2021-06-09 15:48:16 отредактировано Андрей_)

Re: библиотека lua_share (обмен данными между скриптами lua)

toxa пишет:
Андрей_ пишет:

Тогда можно сделать маршаллинг функций как объектов?

да вы смеетесь что ли? :)

Нет, я с lua только знакомлюсь и не знал, что определение функции получить не так просто )
Касательно библиотеки, не хватает блокировок. Возможности создавать mutex к каждому объекту общей памяти, для более осмысленной атомарности. Взял на запись, изменил, отпустил. Другие подобные потоки ждут и просыпаются автоматически. Вобщем-то базовый функционал для организации работы многопоточной среды с общей памятью. Очень не хватает. Простой метод эксклюзивного взятия и метод освобождения. Эксклюзивные взятия блокируют друг друга, но не блокируют обычные чтения.

А до кучи и более низкоуровневый интерфейс использования других примитивов синхронизации. Создающий в общей памяти autoresetevent, manualresetevent и предоставляющий их методы. Можно и семафор, хотя он редко нужен. Mutex можно явно не делать, он покрывается обычной переменной в общей памяти. Эвенты полностью этим все же не покрываются.

45

Re: библиотека lua_share (обмен данными между скриптами lua)

1. это невозможно без переписывания всей lua-машины
2. это будет очень медленно
3. это никому не нужно

разработчики квика пытаются натянуть сову на глобус, вместо этого им нужно было немножко больше подумать в начале чтобы избежать подобных проблем в принципе. либо сделать скрипты однопоточными, либо просто выбрать другой встраиваемый язык, скажем, питон. он имеет gil, который позволяет избежать проблем с синхронизацией потоков.

есть смысл, почему lua-машина принципиально однопоточная. благодаря этому она очень легкая, быстрая и может быть собрана даже для некоторых 8-битных машин и микроконтроллеров, которые в принципе не имеют OS с примитивами синхронизации и прочим.

46 (2021-06-09 17:09:08 отредактировано toxa)

Re: библиотека lua_share (обмен данными между скриптами lua)

Хм… по-моему я вас не так понял. Вы хотите иметь rpc между двумя запущенными скриптами внутри одного квика? Нет же ничего проще: все тот же lua_share. Просто тот второй скрипт должен процессить rpc, иначе вызывающий скрипт перейдет в вечное ожидание и все повиснет. Посмотрите как устроен скрипт, который запускает lua_share_server.exe: ничто не мешает ему быть запущенным внутри квика, а не в отдельном процессе.

ps: Единственное ограничение - он должен быть один. Таким образом, можно иметь 100 скриптов которые вызывают функции в каком-то одном 101-ом скрипте.
pps: Квик мог бы сделать встроенный rpc, это даже довольно просто: им нужно запускать скрипты пользователей в режиме отладки, таким образом они будут периодически прерываться, и в эти моменты можно поллить очередь и исполнять запросы; что угодно, да хоть бы даже и вызывать колбэки по приходу данных.

47 (2021-06-09 21:30:46 отредактировано Андрей_)

Re: библиотека lua_share (обмен данными между скриптами lua)

toxa пишет:

Хм… по-моему я вас не так понял. Вы хотите иметь rpc между двумя запущенными скриптами внутри одного квика? Нет же ничего проще: все тот же lua_share. Просто тот второй скрипт должен процессить rpc, иначе вызывающий скрипт перейдет в вечное ожидание и все повиснет. Посмотрите как устроен скрипт, который запускает lua_share_server.exe: ничто не мешает ему быть запущенным внутри квика, а не в отдельном процессе.

ps: Единственное ограничение - он должен быть один. Таким образом, можно иметь 100 скриптов которые вызывают функции в каком-то одном 101-ом скрипте.
pps: Квик мог бы сделать встроенный rpc, это даже довольно просто: им нужно запускать скрипты пользователей в режиме отладки, таким образом они будут периодически прерываться, и в эти моменты можно поллить очередь и исполнять запросы; что угодно, да хоть бы даже и вызывать колбэки по приходу данных.

Да, хочу нормально синхронизовать несколько скриптов при их доступе к общей памяти. Не про rpc сейчас. Все как в ваших примерах, только с добавлением режима эксклюзивного доступа. Взял..изменил..положил. Пока менял, другие скрипты\потоки блокируются при попытке так же взять эксклюзивно. Стандартная ситуация. Уверен все возможно, т.к. все сводится к виндузовым потокам, обращающимся к коду в dll. У вас же есть атомарность чтения\записи. Значит можно и вот так расширить. В dll, на нормальном языке программирования, создавать mutex, соответствующий объекту данных, к которому берут эксклюзивный доступ. И т.д.

И практическая ситуация. У меня в общей памяти сложная структура данных. Пока один скрипт обрабатывает, другой должен автоматически ждать\пробудиться после. Можно конечно пытаться эмулировать отдельным примитивом-флагом. Скрипт устанавливает его перед началом своей процедуры, а другой поллит со sleep пока флаг не снимется. Но это же не solid, что называется.. Начнутся race conditions. Как всегда при попытке эмулировать многопоточноть поллами. А вот mutex в реализации метода в dll заблокирует обратившийся поток и разблокирует когда надо. И раз библиотека имеет концепцию общей памяти, логично спрятать все это под метод доступа к объекту, как писал выше. Mutex создается при первом запросе эксклюзивного доступа и живет дальше рядом с объектом, не мешая обычным чтениям.
Но и явный интерфейс к примитиву Event тоже был бы полезен. Можно было бы в скриптах использовать WaitForSingleObject, WaitForAny..

48

Re: библиотека lua_share (обмен данными между скриптами lua)

Андрей_ пишет:

И практическая ситуация. У меня в общей памяти сложная структура данных. Пока один скрипт обрабатывает, другой должен автоматически ждать\пробудиться после.

Привет! Я так понимаю, что вам просто нужно переделать __default_namespace_metatable в lua_share_boot.lua таким образом, что бы в структуре данных каждый скрипт менял только нужные элементы, не затрагивая другие. И нет нужды в синхронизации скриптов/потоков.
Пример __default_namespace_metatable не работает с ключами-таблицами:

function set_value(this, key, value)
    local __tbl = this[key]
    if not __tbl then
        this[key] = value; return
    end

    if type(value)~="table" then
        this[key] = value; return
    end

    for k, v in pairs(value) do
        if type(v) == "table" then
            set_value(__tbl, k, v)
        else
            this[key][k] = v
        end
    end
end
-- dataspace metatable implemantation
-- assume that self.__data is a container for actual table data
__default_namespace_metatable = {
    __newindex = function(self, key, value)
        if type(key)~="table" then
            if key == "Clear" then
                self.__data = {}; return collectgarbage()
            end
            set_value(self.__data, key, value)
        else
            local idx = __findkey(self.__data, key)
            if idx then
                self.__data[idx] = value
            else
                self.__data[key] = value
            end
        end
    end,
    __index = function(self, key)
        if type(key)~="table" then
            return self.__data[key]
        else
            local idx = __findkey(self.__data, key)
            if idx then return self.__data[idx] end
        end
        return nil
    end
}

Пусть пространство имен uid имеет следующую структуру:
portfolio[uid]=
{
   [key1] = {ticker = "SiM1", status = "A", plan = 1, posa = 0, price =72500},
   [key2] = {ticker = "RIM1", status = "F", plan = 1, posa = 1, price = 163000},
}

Скрипт1:
portfolio[uid] = { [key1] = {status = "F", posa = 1} }

Скрипт2:
portfolio[uid] = { [key2] = {status = "A", plan = 0, price = 164500} }

49

Re: библиотека lua_share (обмен данными между скриптами lua)

kalikazandr пишет:

что бы в структуре данных каждый скрипт менял только нужные элементы, не затрагивая другие. И нет нужды в синхронизации скриптов/потоков.

Да нет, смысл как раз в том, чтобы каждый скрипт\поток получал целостную версию совокупных данных и так же передавал ее дальше. Друг другу. А обработка как в критической секции, по очереди. Это делается мьютексом. Если бы каждый мог менять свою часть данных независимо, это была бы уже задача с N объектами данных (частей). А дальше та же подзадача синхронизации для каждой части ) Да в принципе мьютексов то бояться не надо. Пусть мы не можем создавать потоки сами, но мы можем делать это, создавая макросы с их потоками main. Но синхронизовать их все равно нужно по взрослому.

50

Re: библиотека lua_share (обмен данными между скриптами lua)

Андрей_ пишет:

Да нет, смысл как раз в том, чтобы каждый скрипт\поток получал целостную версию совокупных данных и так же передавал ее дальше. Друг другу. А обработка как в критической секции, по очереди. Это делается мьютексом. Если бы каждый мог менять свою часть данных независимо, это была бы уже задача с N объектами данных (частей). А дальше та же подзадача синхронизации для каждой части ) Да в принципе мьютексов то бояться не надо. Пусть мы не можем создавать потоки сами, но мы можем делать это, создавая макросы с их потоками main. Но синхронизовать их все равно нужно по взрослому.

В посте выше каждый скрипт может менять общую часть данных, если вы не заметили.

Для "синхронизации" в lua_share существует специальное пространство имен:
- predefined "queues" namespace implementation.
Это решает вашу задачу на 100%, а вот как долго она будет решаться? напрямую зависит от кол-ва скриптов х на 1-15 мс
А оно вам надо - такая многопоточность?