Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Программирование на Lua _ Lua-AIO

Автор: alex82 10.1.2010, 5:52

Lua-AIO (Lua All-in-One) представляет собой пакет для написания программ на Lua, созданный по принципу "Всё в одном". Пакет включает в себя практически все библиотеки, которые могут понадобиться при написании приложений.

В состав пакета входят:
Хост-программа Lua-AIO (lua.exe) - приложение, позволяющее запускать Lua-скрипты. Отличия от хост-программы из официального дистрибутива Lua:

Встроенные функции
Функции:

Код
thid = ThreadCreate(function, {args,...})
Создает ветвь для выполнения функции "function" с аргументами "args,...". Функция возвращает идентификатор ветви "thid".

Код
ThreadDestroy(thid)
Уничтожает ветвь "thid", созданную при помощи функции ThreadCreate.

Код
ThreadWait(msec)
Приостанавливает ветвь на "msec" миллисекунд.

Код
ThreadNewMutex()
Создает http://mydc.ru/r/?http://ru.wikipedia.org/wiki/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81, который может быть использован при помощи функций ThreadLockMutex и ThreadUnlockMutex.

Код
ThreadLockMutex(mutex)
Блокирует совместный доступ к указанному мьютексу (предварительно созданному при помощи функции ThreadNewMutex)

Код
ThreadUnlockMutex(mutex)
Разрешает совместный доступ к указанному мьютексу (предварительно созданному при помощи функции ThreadNewMutex)

Код
ThreadDestroyMutex(mutex)
Уничтожает мьютекс


События:

Код
function OnError(msg) ... end
Вызывается при возникновении ошибки в скрипте.

Код
function OnStop() ... end
Вызывается при получении kill-сигнала при использовании под Linux, а также при остановке службы Windows.
Параметры командной строки
-v: Показать версию Lua-AIO
-d: Режим отладки. В этом режиме Вы можете отправлять сообщения в отладочное окно при помощи функции print().
-t: Запустить тест. С этим параметром программа будет запущена в консольном режиме.
-i: Установить программу как системную службу.
-u: Удалить службу.
-c <имя файла>: Компилировать указанный скрипт.
<имя файла>.lua: Запустить указанный скрипт

Библиотеки:
Раскрывающийся текст
base64: Предназначена для форматирования данных в соответствии со стандартом MIME.
Сайт: http://mydc.ru/r/?http://www.tecgraf.puc-rio.br/~lhf/
Автор: Luiz Henrique de Figueiredo


bc: Библиотека больших чисел, основанная на исходном коде GNU bc
Сайт: http://mydc.ru/r/?http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/
Автор: Luiz Henrique de Figueiredo


ber: Simple Basic Encoding Rules (BER) of Abstract Syntax Notation One (ASN.1)
Автор: Nodir Temirhodzhaev


bit: bitlib. Операции с битами
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/bitlib/
Автор: Reuben Thomas


bz2: bzip2 и libbzip2. Сжатие данных.
Автор: Julian R Seward


cd: CD (Canvas Draw) Кроссплатформенная графическая библиотека.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/cdlib/
Автор: Antonio Scuri


crypto: Интерфейс к криптографической библиотеке OpenSSL.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/luacrypto/
Автор: Keith Howe, Enrico Tassi


curl: Lua-cURL library.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/lua-curl/
Автор: Jьrgen Hцtzel


dc: Библиотека, реализующая некоторые функции протоколов NMDC и ADC

des56: (часть библиотеки md5) Криптографическая библиотека для Lua.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/md5/
Автор: Andre Carregal, Tomas Guisasola, Danilo Tuler, Fabio Mascarenhas


extend: Расширяет некоторые функции Lua.
Автор: Arnaud Le Ber


gd: Библиотека для обработки изображений, основанная на библиотеке GD от Thomas Boutell.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/lua-gd/
Автор: Alexandre Erwin Ittner


geoip: Реализует некоторые функции geoIP
Сайт: http://mydc.ru/r/?http://www.maxmind.com/
Автор: MaxMind LLC


gzip: Доступ к функциям библиотеки gzip
Сайт: http://mydc.ru/r/?http://mega.ist.utl.pt/~tngd/lua/
Автор: Tiago Dionizio


he3: Реализует функции декодирования Хаффмана
Автор: Jan Vidar Krey


hpdf: Библиотека для создания PDF-файлов.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/luahpdf/
Автор: Kurt Jung


iconv: Библиотека, предназначенная для преобразования текста из одной кодировки в другую.
Сайт: http://mydc.ru/r/?http://lua-iconv.luaforge.net/
Автор: Alexandre Erwin Ittner


im: IM is a toolkit for Digital Imaging.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/imtoolkit/
Автор: Antonio Scuri


irr: Irrlicht (Irrlicht Engine) — трёхмерный графический движок.
Сайт: http://mydc.ru/r/?http://irrlua.sourceforge.net/
Автор: Josh Turpen


iup: IUP Переносимый тулкит для создания графического интерфейса.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/iup/
Автор: Antonio Scuri


lfs: Реализует функции для работы с файловой системой
Сайт: http://mydc.ru/r/?http://www.keplerproject.org/luafilesystem
Автор: Roberto Ierusalimschy, Andrй Carregal and Tomбs Guisasola


lpeg: pattern-matching library based on Parsin Expression Grammars (PEGs)
Сайт: http://mydc.ru/r/?http://www.inf.puc-rio.br/~roberto/lpeg/
Автор: Roberto Ierusalimschy


lualdap: Простой интерфейс к LDAP-клиенту
Сайт: http://mydc.ru/r/?http://www.keplerproject.org/lualdap/index.html
Автор: Andre Carregal, Alessandro Hecht, Danilo Tuler, Leonardo Godinho, Luis Eduardo Jason Santos and Tomas Guisasola


lxp: SAX XML-парсер, основанный на библиотеке Expat
Сайт: http://mydc.ru/r/?http://www.keplerproject.org/luaexpat/
Автор: Roberto Ierusalimschy, Andrй Carregal and Tomбs Guisasola


md5: Криптографическая библиотека для Lua
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/md5/
Автор: Andre Carregal, Tomas Guisasola, Danilo Tuler, Fabio Mascarenhas


mysql: Библиотека для работы с БД MySQL.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/luasql/
Автор: Roberto Ierusalimschy, Andrй Carregal and Tomбs Guisasola


ntlua: (Windows only) create Windows NT administration and logon scripts.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/ntlua/
Автор: Antonio Scuri


pg: Библиотека для работы с БД PostgreSQL
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/luapgsql/
Автор: Stefan


ploticus: Пакет ПО для создания графиков из набора данных.
Сайт: http://mydc.ru/r/?http://ploticus.sourceforge.net/
Автор: Steve Grubb


profiler: time profiler designed to help finding bottlenecks on your Lua program.
Сайт: http://mydc.ru/r/?http://luaprofiler.luaforge.net/
Автор: Luiz Silveira, Miguel Osуrio, Fбbio Mascarenhas, with the help of Andrй Carregal, Tomбs Guisasola and Danilo Tuler


rexlib: Библиотека реализует функции, позволяющие использовать две основные системы регулярных выражений : posix и pcre.
Сайт: http://mydc.ru/r/?http://lrexlib.luaforge.net/
Автор: Reuben Thomas and Shmuel Zeigerman


sdl: Позволяет использовать часть функций библиотеки SDL: the SDL, SDL_image, SDL_mixer, SDL_net and SDL_ttf.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/luasdl/
Автор: Kein-Hong Man


serial: Позволяет использовать параллельный порт ПК.
Автор: Arnaud Le Ber


snmp: Реализует функции, необходимые для создания SNMP-клиента. Основана на библиотеке NET-SNMP.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/luasnmp/
Автор: Herbert Leuwer


socket: Библиотека для работы с сокетами. Реализует доступ к TCP, UDP, DNS, SMTP, FTP, HTTP, MIME.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/luasocket/
Автор: Danilo Tuler, Diego Nehab


sqlite: Библиотека для работы с БД SQLite 2.
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/luasqlite/
Автор: Tiago Dionizio


sqlite3: Библиотека для работы с БД SQLite database 3.
Сайт: http://mydc.ru/r/?http://www.nessie.de/mroth/lua-sqlite3/index.html
Автор: Michael Roth


ssl: Создание TLS/SSL-соединений с использованием библиотеки socket.
Сайт: http://mydc.ru/r/?http://www.inf.puc-rio.br/~brunoos/luasec/0.2/index.html
Автор: Bruno Silvestre


tcps: Библиотека для создания TCP-серверов
Сайт: http://mydc.ru/r/?http://www.summerblue.net/computing/libiocp/index.html for windows and "epoll" for Linux.


th: Алгоритмы Tiger Hash
Сайт: http://mydc.ru/r/?http://www.cs.technion.ac.il/~biham/Reports/Tiger/


tth: Алгоритмы TigerTree Hash
Сайт: http://mydc.ru/r/?http://www.cs.technion.ac.il/~biham/Reports/Tiger/


udps: Библиотека для создания UDP-серверов
Автор: Arnaud Le Ber


uname: retrieve some machine specific information
Автор: Arnaud Le Ber


unicode: support for ASCII, LATIN and UTF-8 unicode
Сайт: http://mydc.ru/r/?http://luaforge.net/projects/sln/
Автор: Klaus Ripke


wx: Многофункциональная кроссплатформенная библиотека, основанная на wxWidgets. Основное назначение - создание графического интерфейса приложений.
Сайт: http://mydc.ru/r/?http://wxlua.sourceforge.net/
Автор: Francesco Montorsi


xml: Парсер XML-файлов, основанный на Tiny XML 2.5.2
Сайт: http://mydc.ru/r/?http://sourceforge.net/projects/tinyxml/
Автор: Lee Thomason + Arnaud Le Ber


zip: Чтение содержимого zip-архивов
Сайт: http://mydc.ru/r/?http://www.keplerproject.org/luazip/
Автор: Danilo Tuler


zlib: Использование функций библиотеки zlib
Сайт: http://mydc.ru/r/?http://mega.ist.utl.pt/~tngd/lua/
Автор: Tiago Dionizio


Подробная информация о библиотеках доступна в справке (см. ниже).
Также, более подробную информацию о некоторых библиотеках пакета можно получить в http://mydc.ru/forum33.html разделе.


Скачать последнюю версию версию дистрибутива можно с http://mydc.ru/r/?http://luaforge.net/projects/luaaio/

Файл справки (формат CHM) можно скачать http://mydc.ru/r/?http://luagu.ru/wp-content/uploads/2010/01/luaaio_chm.rar
Справка в формате HTML:  luaaio_doc.rar ( 4.67 мегабайт ) : 65


Дополнительно:
Как запустить скрипт под Lua-AIO
Имеются как минимум три способа запустить Ваш скрипт под Lua-AIO:
Первый (и самый очевидный): При запуске хост-программы указываем имя скрипта в качестве параметра командной строки. Например:
Код
"C:\luaaio\lua.exe" C:\scripts\myscript.lua

При этом можно использовать относительный путь. Т.е. если Ваш скрипт лежит в папке Lua-AIO, то запустить его можно так:
Код
"C:\luaaio\lua.exe" myscript.lua

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

Второй (плавно вытекающий из первого): Тупо перетащить Ваш скрипт на иконку lua.exe. Результат ничем не отличается от предыдущего, с той лишь разницей, что при этом совершается меньше телодвижений.

Третий способ (правильный): присвоить хост-программе имя Вашего скрипта. Например, если скрипт зовется "myscript.lua", то необходимо переименовать lua.exe в myscript.exe. Данный способ имеет одно очень важное преимущество - при попытке запуска скрипта, содержащего грубую синтаксическую ошибку, хост-программа выдаст сообщение, содержащее подробную информацию о характере ошибки. При использовании первых двух способов, приложение закроется молча, и Вам прийдется самостоятельно выяснять причину незапуска скрипта.
Программы, созданные с использованием Lua-AIO
  • http://mydc.ru/topic153.html (клиентская чать)
  • http://mydc.ru/topic2131.html (клиентская часть)
  • Утилиты из пакета http://mydc.ru/topic2359.html

Автор: Nickolya 10.1.2010, 19:11

alex82, если есть опыт - расскажи пожалуйста про мьютексы и потоки, а то мне кажется это не дает никакого прироста производительности, только заморочка, а единственный плюс - изолированность, которая при грамотном построении скрипта и не нужна.

Автор: alex82 10.1.2010, 22:22

Nickolya
Преимущество многопоточности - не изолированность, а независимость скрипта (да и, в общем-то, самой хост программы, под управлением которой работает этот скрипт) от времени выполнения определенных функций в тех случаях, когда время выполнения этих функций ограничено не производительностью компа, а чем-то иным.

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

В качестве другого примера могу привести твой пингер хабов. Вот скажи - может ли он пинговать несколько хабов одновременно? Могу поспорить что нет. А мой может, поскольку использует многопоточность.

Также не стоит забывать, что Lua-AIO используется для создания программ с графическим интерфейсом, и использование ветвей позволяет избежать подвисания GUI во время выполнения продолжительных и ресурсоемких фрагментов кода.

Автор: Nickolya 10.1.2010, 22:55

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

Автор: alex82 10.1.2010, 23:37

Вот кусок кода из того самого пингера, о котором я говорил (некоторые фрагменты удалены, дабы не отвлекать от самой сути):

Код
    [2] = function()
        tData.NumHubs = 0
        local hubs,num = {},0
        local cur = con:execute(("SELECT address,port FROM %shubs WHERE `pinged`<%s AND `special`=0"):format(tMySQL.Prefix,os.time()-tCfg.RePingTime*3600))
        local address,port = cur:fetch()
        while address do -- В этом цикле мы разбиваем таблицу хабов на несколько. Число таблиц равно числу ветвей
            tData.NumHubs = tData.NumHubs+1
            num = num+1
            if num > tCfg.PingThreads then num = 1 end
            if not hubs[num] then hubs[num] = {} end
            table.insert(hubs[num],{address,port or 411})
            address,port = cur:fetch()
        end
        -- Тут был кусок кода, отвечающий за общие элементы интерфейса
        local threads,dist,progr = tCfg.PingThreads,34,180
        if threads > #hubs then threads = #hubs end
        GUI.Status,tTh = {},{}
        for i = 1,threads do -- В этом цикле мы создаем ветви, которые и будут пинговать хабы
            GUI.Status[i] = {}

            -- Тут был кусок кода, отвечающий за элементы интерфейса каждого потока.
            tTh[i] = {}
            tTh[i].Env = luasql.mysql()
            tTh[i].Con = assert(tTh[i].Env:connect(tMySQL.DB,tMySQL.User,tMySQL.Pass,tMySQL.Host))
            tTh[i].Con:execute("SET NAMES "..tMySQL.Charset)
            tTh[i].ThID = ThreadCreate(PingThread,{i,hubs[i]}) -- Тут, собственно, и создается ветвь. В качестве аргументов передается номер ветви, и её персональная таблица хабов
        end
        GUI.StatusPanel:SetScrollbars(1, dist, 1, threads, 0, 0, false)
    end,

Автор: Jaska 28.1.2010, 22:42

Поставил LUA AIO на Ubuntu 9.10 руководствуясь http://mydc.ru/r/?http://luaaio.luaforge.net/installation.html статьей.

Накидал код для примитивного тестирования. В windows работает, но при цикле в 2000 действий thread'ы отказываются создаваться. Вообще говоря, это мое первое знакомство с thread'ами.

Вот собственно сам код:

CODE
require"modules.http"

local sURL = "http://localhost"
local iRequests = 1900

local tResult = {}
local iMaxTime = 0
local iTime = 0
local iStep = 100
local iCount = 0

local tID = {}

function SendRequest(id)
local iStart = os.clock()
local sResult = http.request(sURL)
local iEnd = os.clock()
tResult[id] = iEnd - iStart
iTime = iTime + tResult[id]
iCount = iCount + 1
if tResult[id] > iMaxTime then
iMaxTime = tResult[id]
end
ThreadDestroy(tID[id])
end

function Max()
local iCount = 0
for i in pairs(tResult) do
iCount = iCount + 1
end
return iCount
end

for i = 1,iRequests do
iStep = iStep - 1
tID[i] = ThreadCreate(SendRequest, { i })
end

while iCount ~= iRequests do end
print("Время выполнения программы: "..os.clock().." сек. Самый длительный запрос: "..iMaxTime.." сек. Среднее время: "..string.format("%0.3f", (iTime / iRequests)))


На каждую ветвь приходится 1 запрос. Возможно это расточительство. Пробовал помещать несколько запросов в ветвь, но быстродействие кода падает. Но это не основная проблема, под ubunt'ой lua редактор запускается, код выполняться отказывается. Просто виснет. И вообще создалось ощущение что работает на честном слове.

Автор: mariner 28.1.2010, 23:11

а все потому, что тарбол гнилой и мерзкий. Надо из исходников с оптимизацией

Автор: Jaska 28.1.2010, 23:32

о последнем можно поподробнее??

Автор: mariner 29.1.2010, 0:04

http://mydc.ru/r/?http://wiki.auditory.ru/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%B8_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0#.D0.9E.D0.BF.D1.82.D0.B8.D0.BC.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F - лови