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
Сайт: 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
Подробная информация о библиотеках доступна в справке (см. ниже). Также, более подробную информацию о некоторых библиотеках пакета можно получить в 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
а все потому, что тарбол гнилой и мерзкий. Надо из исходников с оптимизацией