Imersio Arrigo, во-первых проигнорированный колбек не будет исоплнен повторно. Во-вторых колбек вызванный при обработке очереди этого же колбека создает потерю данных.
Не было бы проблемы - не было бы просьбы её решить.
Добавить функции вида pauseCallbacks и resumeCallbacks, где первая приостанавливает вызовы многопоточных колбеков, а вторая возобновляет. Использование таких функций позволит избежать потери данных и обрушения скриптов в некоторых ситуациях.
Владимир, интерфейс тут и так минимальный, слишком скудный и с неполным покрытием я бы сказал. Его надо расширять и углублять, а вы наоборот кастрировать предлагаете. При том что по итогу юзерам весь этот функционал придётся велосипедить самостоятельно, то есть в области простоты пользования будет отрицательный рост что называется.
Старатель, локи снимаются автоматически при вызове любой С-функции а также при выделении памяти.
* любая функция QUIK * любая функция Lua (все библиотечные функции + pairs, next, getmetatable и т.п.) * любая функция из внешней DLL * любая операция со строковым результатом * любая операция по созданию новых объектов
Инкрементация это самый надежный способ. При наличии нескольких источников транзакций, каждый из них приклеивает к своему внутреннему номеру транзкции свой глобальный уникальный идентификатор, что обеспечивает уникальность чисел.
TGB, изестный интернетный феномен - когда кто-то несет чушь, люди хотят такое недоразумение исправить. Когда предъявляют исходники или дизассемблер или хотя бы логически жёсткую цепочку, тогда есть разговор. Когда говорят "ну у меня вот в моем игрушечном стенде все работает" и удобно игнорируют то что у других людей проблемы никуда не делись - это чушь. Впрочем вы товарищ скатываетесь в такой же уровень самоуверенной шизофазии как Владимир так что вас тоже скоро буду игнорировать наотрез. Если вдруг забыли, напоминаю что по вашему-же умозаключению мои навыки и/или познания гораздо превосходят ваши.
TGB, Если бы у вас были весомые аргументы, то был бы другой разговор. Но у вас аргумент уровня "works on my machine", причём только для версии 8.13.0 а не 8.13.1, и поверх этого ваш код тестирует совершенно другой вид ошибки. Хэт-трик просто.
Контр-предложение: добавить API для работы с таблицей новостей, чтобы можно было впоследствии разрабатывать скрипты для загрузки новостей с различных платформ.
TGB, такого рода изменения падают скорее в область "защиты от дурака". Что Эйнштейн по этому поводу думал мы все знаем, Мёрфи еще добавил что на защиту от большого дурака попросту находится еще больший дурак, так что ничего свыше санитизации входных данных делать не требуется - особо одарённые всё равно сломают. С учётом того, что такая ситуация возникает в настолько маргинальных сценариях, что само явление обнаружено было только в синтетическом тесте, считаю что делать патчи - тем более хакать сам язык Lua - здесь нецелесообразно. Достаточно просто упомянуть в документации, что голая арифметика и булевая логика вообще безничего в численном цикле может завесить систему. Также смею заметить что обсуждение этого изменения представляет собой байкшеддинг, и вместо лёгких задач надо бы решать важные - то что прерывания иногда разрушают стек и вызывают обрушение скрипта, например.
На мой взгляд достаточно просто добавить в инструкцию предупреждение, что код, не вызывающий никаких С-функций и не создающий никаких объектов в памяти, не может быть прерван и соответственно может создавать зависания до окончания выполнения.
Предложить пользователям вставить sleep(0) во внешних циклах при отсутствии каких-либо других операций, снимающих лок.
Баги были есть и будут. Тут есть два подхода: постоянно обновляться до самой свежей версии, в процессе чего что-то может сломаться, либо выбрать версию и сидеть на ней всё обозримое будущее, а с багами люди разберутся на месте.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
После 15 лет общения с людьми посредственного уровня программирования но очень высокого самомнения (вроде вас двоих) я перестал считать нужным удерживать нужный курс беседы когда фокус меняется с посредственного программирования на высокое самомнение.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Старатель, аргументы я привел, вы их благополучно проигнорировали. Тут что называется нами три типа людей: есть джентльмены которые соглашаются, есть обезьяны которые начинают спорить с задокументированными и/или воспроизводимыми вещами, и есть такие вот индивиды которые просто делают вид что ничего сказано и не было. Неприятно когда просишь обосновать что-то думая что умнее всех и никто ничего не скажет, а кто-то берет и обосновывает, понимаю.
Совет от профи: просто не работайте с одной и той же памятью из разных тредов, вот и все. В луа конечно мутексов нету, уж не предусмотрено многопоточности на уровне вм, просто в арке люди слову на глобус натягивают. Но вам родина нафига двойную буферизацию дала?
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
TGB, подразумевая что заспавнить вторую вм с аргументами это сложная и нетривиальная задача. Можно конечно изголяться чтобы например глобалки сами синхронизировались, но это вы уже сами себе Буратино.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
По поводу многопоточности кстати. Существует классические (т.е. не родом из пьяного угара) имплементации, например LuaLanes. Советую такого рода библиотеки использовать.
То что вам поенепременно надо использовать непотокобезопасные методы в многопоточной программе - тут что называется своих мозгов в чужую голову не вставишь.
Старатель, ходить по массиву можно обычными функциями, а удалять/добавлять значения надо потокобезопасными. Вообще, удалять значения из массива в цикле по этому же массиву это плохая практика; вы тут судя по всему просто очищаете стол, вместо этого можно просто создать пустой - это не только надежнее и проще, но еще и работает быстрее.
Евгений, да, ваш браузер окончательно скуколдился. Пора переходить на Google Chrome или Microsoft Edge. Для мазохистов еще есть Brave, Opera и старые форки файрфокса.
Kolossi, да. Если ждать в цикле пока количество свечек станет больше 0, то видно что значение прыгает от 0 сразу к 5000 (или сколько свечек вернёт брокер + имеется в архиве).
Kolossi, это неважно - размер датасорца меняется в момент завершения загрузки данных. При работе с колбеками тоже неважно - они явно указывают какая свеча была загружена.
Владимир, кстати вынужден согласиться что здесь колбеки действительно работают как прерывания. Когда я спорил по этому вопросу я допустил ошибку, что предрассудил будто в QUIK используется такая же простая и адекватная система многопоточности скриптовых языков как и во всём остальном мире.
Таки нет. Колбеки приходят когда им удобно. При этом тред скрипта может прерываться в любой точке либо не прерываться вообще (с зависанием QUIK) по велению левой пятки хоста и оптимизатора байткода.
Судя по всему в примере просто sleep(0) занимает больше всего времени и вероятность что колбек выпадет в этот момент наивысшая.
i = 1e8
s = ""
function OnStop ( )
i = -i
s = s .. " stop "
return 5000
end
function main ( )
-- sleep = function ( ) end
while i > 0 do i = i - 1; s = "before "; sleep ( 0 ) s = s .. " after" end
message ( s )
end
Колбеки дёргаются внутри sleep(). Я помнится говорил что можно так сделать, не знаю было ли уже так сделано к тому моменту. То что весь скрипт работает в одном потоке это хорошо. Теперь осталось отсоединить этот поток от главного треда QUIK. Впрочем Старатель вроде как поймал всю ту же старую ошибку с разрушением стека, может где-то что-то пытается прервать тред скрипта. С многопоточностью в скриптовых языках конечно есть только один надежный подход - не иметь её, на каждый тред создавать отдельную виртуалку.
Длина тени показывает суммарный объем заявок которые могут исполниться по этой цене. Только ступеньки должны быть вровень с заявками, а не свешены вниз.
Владимир, колбеки из главного треда, как в инструкции написано. Может я инструкцию неправильно понял?
Цитата
Во время выполнения функции main() Lua скрипт не мешает работе основного функционала РМ QUIK, таким образом, внутри функции main() использование функции sleep() не приводит к «подвисанию» РМ QUIK
При использовании событийной модели Lua скрипт выполняется в двух потоках: функции обратного вызова выполняются в основном потоке РМ QUIK, а функция main() в дополнительном потоке РМ QUIK
А тут у нас подвисание если НЕ использовать sleep() в main(), и события не приходят.
Хм. При исполнении кода без sleep не то что колбеки не вызываются, а вообще терминал намертво зависает. 8.13.0
Код
i = 1e5
run = true
function OnStop ( )
message ( "OnStop" )
run = false
return 5000
end
--sleep = function ( ) end
function main ( )
while run and i > 0 do i = i - 1; sleep ( 0 ) end
message ( tostring ( i ) )
end
Anton, дрочение таймаута слипа это не архитектура. Ну и да, примерно также двадцать лет методом ватерфол никто не разрабатывает, потому что в итоге получается долго, дорого и криво, т.к. от апгрейда архитектуры в процессе разработки стараются отказываться.
Anton, тут скорее что два старпёра привыкли программировать с аутизмом олимпийского уровня потому что иначе в 2 килобайта 2 мегагерца не влезало, а теперь даже если делать через жопу то всё равно получается микроскопическая нагрузка. По итогу имеем что у старпёров тратится большое количество времени разработки ради экономии на спичках, а могли бы в это время чем-то полезным заниматься. Уже двадцать лет учат людей что не надо делать оптимизацию там, где и так хорошо работает, потому что это пустая трата времени - алё очнись Нео ты обосрался.
Не вижу причин по которым собственно надо использовать задержки. Загрузится ЦП на 100% да и фиг с ним, сейчас в каждом тостере по 12 ядер. Вы же не батарею на ноутбуке экономите?
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Старатель, во-первых если раньше с этим кодом каждый раз работало а теперь каждый раз отказы, то не в коде проблема. Во-вторых выбросить пять тысяч сообщений занимает несколько минут так что если просто в ожидании было дело то их бы там было гораздо меньше. И в-третьих это демонстрационный код, в реальном коде ожидание подключения стоит в другом месте - суть от этого не меняется.