Многопоточность в Луа

Страницы: 1
RSS
Многопоточность в Луа
 
Прошу дать совет.
У меня работает скрипт, обрабатывающий большой объём данных. На расчёт уходит много времени. Прошу подсказать, можно ли в луа реализовать многопоточность, чтобы эффективно задействовать все ядра виртуальной машины.
В нынешнем виде скрипт работает так:
Код
f_ticker_list="GAZR,SBRF,MIX,Si,RTS"
         for instrument in string.gmatch(f_ticker_list,"%w+") do
--утомительные расчёты на основе анализа множества файлов с рыночной информацией
end
Он задействует только 1 ядро виртуальной машины.
Как разбросать этот процесс на другие свободные ядра виртуалки?
Спасибо
 
Я нашёл библиотеку lualanes
Она даёт многопоточность http://lualanes.github.io/lanes/
Но не могу разобраться, где мне запускать эти потоки? Внутри функции main или за её пределами?
Если запускать длительный процесс ДО запуска main, то будет подвисание скрипта.
 
Цитата
Let_it_go написал:
Но не могу разобраться, где мне запускать эти потоки? Внутри функции main или за её пределами?
Вы же их не просто запускаете, а для проведения расчётов, у вас в коде есть место, где эти расчёты начинаются, и где заканчиваются. Вот в этом месте просто добавьте запуск дополнительных потоков, и дальше, ждите от них результата в этом же месте. Там где у вас комментарий «--утомительные расчёты на основе анализа множества файлов с рыночной информацией» стоит...
 
Спасибо. Это реально задействует новые ядра процессора?
 
Цитата
Let_it_go написал:
Спасибо. Это реально задействует новые ядра процессора?
Ну должно, если верить рекламе LuaLanes... )))
Я её сам не стал использовать, мне не нравится изоляция потоков по переменным и необходимость использовать объекты Linda для обмена данными, ну зато эта библиотека будет работать поверх стандартной однопоточной Lua.
 
Известно из доков:

Все callback функции выполняются в основном потоке QUIK.
Функция main в каждом скрипте запускается в своем потоке.



Вопрос по многопоточности в LUA:Программа QUIK создает потоки для каждого скрипта напрямую через CreateThread или берет из пула потоков, предоставляемых Windows.
Например, через QueueUserWorkItem ?


К чему это?
Запускаю несколько скриптов  заведомо больше общего количества ядер процессоров.
Внутрь скриптов вставляю различные функции ожидания или засыпания потока типа

Sleep
WaitForSingleObject
WaitForMultipleObject и т.д.

При выходе потока из спячки ОС Windows вернет управление в тот же самый поток или в любой другой свободный поток из рабочего пула потоков Windows?
 
В потоке main() все эти функции работают именно так, как от них ожидается: выполнение функций останавливается и продолжается без сторонних эффектов.
 
Цитата
s_mike@rambler.ru написал:
без сторонних эффектов.
Это означает, что не используется рабочий пул потоков (например, через функцию QueueUserWorkItem) и возврат после спячки ВСЕГДА осуществляется в поток с тем же номером, который был и до спячки в потоке main().
Я правильно понял?
 
Я не могу гарантировать наличие или отсутствие каких то буковок в исходных текстах терминала, но то что возврат идет в тот же поток исполнения, подтверждается моим опытом.
 
странный вопрос про
Sleep
WaitForSingleObject
WaitForMultipleObject и т.д.

это ведь функции ОС. они не имеют вообще никакого отношения к Lua. мухи отдельно, котлеты отдельно.
от начала и до конца (входа/выхода) каждой из этих трёх функций, вы находитесь вне Lua.
 
Цитата
Цитата
s_mike@rambler.ru написал:
подтверждается моим опытом.
Спасибо Вам, что у вас есть подобный опыт.
Надеюсь, что разработчики QUIK этот подход менять не будут.
 
Цитата
Павел Bosco написал:
вы находитесь вне Lua
Да, это так.
Но потоки для скриптов создаёт QUIK. Как? Может сказать только разработчик QUIK. Пользователям - только опытным путём.
LUA использует LUAC API, а там и вызов функции ожидания ОС. А возврат зависит от вызова. Отсюда был и вопрос.
Не хотелось бы влезать в диспетчеризацию потоков ОС. Оставим это разработчикам QUIK.


Насколько я помню, вы используете PIPE каналы с гибридным способом ожидания (OVERLAPPED +SLEEP).
Вопрос по PIPE:
1. Вы для каждой бумаги создаёте свой канал в отдельном скрипте(потоке) или для каждой бумаги создаете свой экземпляр канала в одном скрипте?
2. При обмене сообщениями можно ли пихать в PIPE несколько сообщений и на другом конце автоматически считывать ровно по одному сообщению без операций парсинга потока?
(Как FIFO). Ткните меня, если можно, в пример или функцию, используемую для этого.  
 
Цитата
Олег написал:
Программа QUIK создает потоки для каждого скрипта напрямую через CreateThread или берет из пула потоков, предоставляемых Windows.Например, через QueueUserWorkItem ?
Windows предоставляет всем нам единственную функцию для создания потоков: CreateThread
Так что в любом случае поток создаётся в итоге через неё.
 
Цитата
Олег написал:
SleepWaitForSingleObjectWaitForMultipleObject и т.д.При выходе потока из спячки ОС Windows вернет управление в тот же самый поток или в любой другой свободный поток из рабочего пула потоков Windows?
Разумеется по выходу из указанных функций произойдёт возврат ровно в этот же поток, иначе и не может быть.

Вообще вы куда-то не туда роете, не теми какими-то вопросами задаётесь.
Вы расскажите чего хотите добиться - возможно, вам предложат решение. Это будет более плодотворный путь.
 
Цитата
swerg написал:
Windows предоставляет всем нам единственную функцию для создания потоков: CreateThread Так что в любом случае поток создаётся в итоге через неё.
Да, это так. QueueUserWorkItem в конце концов тоже вызывает функцию CreateThread для создания потоков.
Только первая функция берёт потоки из текущего рабочего пула. На моей машине-системе ограничение пула 512 потоков. Программа просто арендует их временно  у ОС.

Цитата
swerg написал:
Вы расскажите чего хотите добиться
Изучал форум по концепциям: один скрипт - много бумаг (или каналов обмена с внешней программой) или много скриптов-потоков с одной бумагой ( или одним каналом обмена с внешней программой).
Прочитал, что при увеличении скриптов происходит торможение запуска или работы скриптов. Вот и захотелось полюбопытствовать, как разработчики отдают управление скриптам-потокам LUA.
Ведь если исчерпан пул рабочих потоков, то при запросе потока для скрипта через  QueueUserWorkItem система будет ждать первого освобождения потока из рабочего пула и только потом выдаст его приложению.
У меня задержка идет после аренды 512 потоков QueueUserWorkItem. Может у кого и другой пул..
А для CreateThread  такого нет.
 
На 512 инструментов выставляете заявки?
 
Цитата
swerg написал:
На 512 инструментов выставляете заявки?
Это результаты проверки граничных условий работы функции на С/С++ без QUIK
 
Разработчикам Quik:
OC: Windows7
Средство просмотра: Process Explorer v16.25
Объект Quik ver.7.11 and ver.8.0.23

При запуске Lua скрипта запускается новый поток. При остановке скрипта HANDLE потока остается висеть в системе.
При запуске того же скрипта создается новый Handle потока (старый не удаляется).
Если контекст потока по некоторым оценкам занимает 1 Мб, то с каждым перезапуском  скриптов ресурс системы уменьшается.

Это утечка ресурсов или так задумано?
Или это только у меня такое?
Страницы: 1
Читают тему (гостей: 1)
Наверх