Кривые шибки в QLua

Страницы: 1
RSS
Кривые шибки в QLua
 
Здесь будут публиковаться кривые ошибки, возникающие, очевидно, из-за двухпоточной схемы работы QLua.
Некоторые ошибки указаны здесь: Потокобезопасные функции в Lua 5.3
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Код
local run = true
function OnAllTrade(alltrade)
end
function OnParam(class, sec)
end
function main()
  local getinfo = debug.getinfo
  while run do
    for i = 1, 100 do
      getinfo(1)
    end
    sleep(1)
  end
end
function OnStop()
  run = nil
end

Ошибка в строке getinfo(1)
Цитата
bad argument #1 to 'getinfo' (number expected, got nil)
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Цитата
Старатель написал:
Ошибка в строке getinfo(1)
Не воспроизвелось, работает себе и работает.
 
Никто и не обещал, что ошибка появляется всегда и сразу.
Можно запустить несколько копий скрипта, как тут, сделать перезаказ обезличенных сделок...
В общем, ошибка именно в этом коде и именно в этом месте присутствует. А как гарантированно воспроизвести - без понятия. Надо смотреть сорцы, откуда там nil.
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Скрипт тот же, строка та же: #2
Ошибка
Цитата
attempt to call a nil value
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Старатель, вопрос-предположение, у вас всегда параллельно со скриптами работает хоть один луа-индикатор?
 
Цитата
Anton написал:
у вас всегда параллельно со скриптами работает хоть один луа-индикатор
Если вопрос по скриптам из текущей и этой тем, то нет, в тестовом квике даже графики не открыты.
Открытые окна:
Скрытый текст
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Цитата
Старатель написал:
в тестовом квике даже графики не открыты
Ага, спасибо. Закралась было мыслЯ, но нет )
 
Давненько я кривее ошибки не видел! Лет примерно 30-35! :)

Суть дела: написал я тестовый скрипт на Lua (чтобы разобраться, что здесь как работает - с языком до этого не сталкивался вообще). Тест заработал, я скопировал код в другой файл, уже почти "боевой", что-то там подрихтовал, запускаю - НЕ работает! Я стал сравнивать оба кода - НУ ВСЁ ТОЧНО ТАК ЖЕ! Проматерившись минут 40, я локализовал, наконец, место глюка. Из серии "не верь глазам своим". Вот полный код теста:

f=true
function main()
while f do
 sleep(5000)
end
message("Скрипт остановлен!")
end

function OnStop()
f=false
end

Как оказалось, ошибка заключается в том (я миллион раз смотрел на это место!), что в "боевом" скрипте у меня стоит sleep(15000) - ну не нужно мне чаще! А эта скотина, как оказалось, через 5 секунд после останова принудительно завершает работу, "воруя" у меня управление. Читаю документацию - там стоит:
[NUMBER time_out] OnStop(NUMBER signal)
Что за "сигнал" - покрыто мраком, и в тестовых примерах никто его не использует, равно как и возвращаемое значение: флаг сбросили - что же тут возвращать? Ан нет - "Функция возвращает количество миллисекунд, которое дается скрипту на завершение работы", а по умолчанию у неё таймаут даётся именно в те самые 5 секунд! По этим словам тоже взгляд скользит, не задерживаясь - какое может быть "время для завершения", если у меня скрипт практически ничего не делает? А вот время на "безделье", на ожидание окончания последнего "sleep" - вынь, да положь! Короче, вот исправленный код, который корректно завершается даже при 15-секундной задержке:

function OnStop()
f=false
return 20000
end

УФ! Не, сейчас-то уже смешно, но тогда!..  :smile:  
 
Здравствуйте, Старатель,

Ваше сообщение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
 
QUIK v.8.11.0.66, Lua 5.4
Однократная ошибка
Цитата
attempt to call a nil value
в цикле for in pairs в main:
Код
local T = {}

function main()

    while run do
      ...
        for k, v in pairs(T) do  -- тут ошибка
          ...
        end
      ...
      sleep(1)
    end

end
stack traceback:
Цитата
in for iterator 'for iterator'

На момент возникновения ошибки таблица T была пуста: за время работы (3 часа) робота в таблицу элементы не добавлялись.
Написать тестовый скрипт для воспроизведения или повторить ошибку не удалось.
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Старатель, добрый день!

Цитата
Старатель написал:
Код
   local  run  =   true 
 function   OnAllTrade (alltrade)
 end 
 function   OnParam (class, sec)
 end 
 function   main ()
   local  getinfo  =  debug.getinfo
   while  run  do 
     for  i  =   1 ,  100   do 
      getinfo( 1 )
     end 
     sleep ( 1 )
   end 
 end 
 function   OnStop ()
  run  =   nil 
 end   

Ошибка в строке  getinfo(1)
Цитата
bad argument #1 to 'getinfo' (number expected, got nil)
К сожалению, нам не удалось понять причину проблемы. Рекомендуем использовать терминал версии 8.11 и Lua 5.4.
Приносим извинения за причинённые неудобства.

Касательно последнего сообщения, ответим немного позже.
 
Цитата
Старатель написал:
QUIK v.8.11.0.66, Lua 5.4
Однократная ошибка
Цитата
attempt to call a nil value
в цикле for in pairs в main:
Код
   local  T  =  {}

 function   main ()

     while  run  do 
       .. .
         for  k, v  in  pairs(T)  do    -- тут ошибка 
           .. .
         end 
       .. .
       sleep ( 1 )
     end 

 end   
stack traceback:
Цитата
in for iterator 'for iterator'

На момент возникновения ошибки таблица T была пуста: за время работы (3 часа) робота в таблицу элементы не добавлялись.
Написать тестовый скрипт для воспроизведения или повторить ошибку не удалось.
Проблема изучается. Постараемся в ближайшее время дать ответ.
 
Здравствуйте, Старатель.

К сожалению нам не удалось понять причину возникновения описанной ошибки.
Приносим извинения за причиненные неудобства.
 
В инструкции написано о довольно странной многопоточности. Действительно ли то, что многопоточность реализована путём патча виртуальной машины Lua в котором треды  в любой момент времени могут очистить стек виртуальной машины и заполнить другими данными для начала исполнение колбека? Если это так, и если момент перехвата управления точно совпадает с моментом передачи аргументов в функцию, то возможна потеря аргументов если стек не был восстановлен корректно при завершении работы колбека.

Старатель, попробуйте запустить этот же код без колбеков.
 
Артем, добрый день!

Никакого патча виртуальной машины Lua не выполнялось.
Вся многопоточность реализована исключительно нативными средствами самого Lua.
 
Roman Azarov, Lua принципиально не поддерживает многопоточность, нативных средств реализации нет. В силу чего многопоточность Lua реализуют запуском отдельной виртуальной машины на каждый тред, и реализацией отправки данных между виртуальными машинами через C++, и вам тоже советую использовать такой-же метод. Один из простых методов реализации колбеков в однопоточном Lua заключается в том, чтобы писать колбеки в стек и сделать так, чтобы функция sleep вызывала колбеки и только после этого останавливала выполнение на оставшееся количество времени. Реализовывать можно прямо в Lua а не в C++.


Код
function sleep(ms)
  local t1 = os.clock()
  for cb, ... in _cplusplus_pollCallbacks() do
    if type(_G[cb]) == 'function' then cb(...) end 
  end
  _cpusplus_sleep(math.max(0, (os.clock() - t1) * 1000 - ms))
end 

У вас тут повреждение стека виртуальной машины в случайные моменты времени, налицо наличие каких-то неочевидных ошибок в реализации многопоточности, и врядли у вас в команде есть программист С++ у которого IQ выше 180 чтобы этот баг можно было отловить и починить. Надо признать что интеллект до уровня Богов Олимпа всё-таки не дотягивает и решать проблему методами, которые под силу простому человеку.
 
Код
if type(_G[cb]) == 'function' then _cplusplus_callbackReturn(cb, cb(...)) end 
 
Артем, Многопоточность достаточно тривиально реализуется на ЛЮБОМ языке - это разновидность программирования данными. Многопроцессность - с этим значительно сложнее, но тоже нет ничего "принципиально не поддерживаемого". Ну, а если "запускать отдельную виртуальную машину на каждый тред", то дурное дело нехитрое. А какой простор для труднонаходимых глюков!..  :smile:

Оставьте хоть sleep в покое - чуть ли не единственное осталось, что пока работает!
 
Владимир, как товарищ Эйнштейн завещал: в теории, теория и практика это одно и тоже, но на практике, практика и теория сильно различаются. Так что то, что способ хорошо реализовать многопроцессность на Lua существует, еще не значит что кто-то его сможет найти в обозримом будущем. Ни один интерпретируемый язык не поддерживает работу на нескольких физических процессорах и изменения на этом фронте не предвидятся.
 
Артем, А при чём тут "работа на нескольких физических процессорах"? И одного вполне достаточно! Нет, "в обозримом будущем" действительно никто ничего не найдёт, я мало сомневаюсь. А вот "в обозримом прошлом" это особых проблем не составляло. Тоже мне бином Ньютона!(с) В частности, я сам делал нечно подобное на JS. А описание "нормального" монитора (сишного) приведено у меня в книге. Фрагмент:

Идея монитора довольно проста – он обслуживает процесс, то есть набор управляющих данных, представленных в виде стека очередей. Новая группа (объектов или событий) просто заносится как очередь (LIFO) на вершину стека (FIFO), т.е. очередь на вершине стека – это самые приоритетные на данный момент данные, которые обслуживаются по своей очереди «вне очереди». Ниже по стеку расположены те очереди, которые не будут обслужены до обработки всех верхних очередей стека. Собственно, именно так работает любой процессор: обслуживание текущей очереди определяется регистром счётчика команд, а выполнение вложенных процедур – регистром указателя стека. Для доступа к возвращаемым значениям методов используется стек аккумуляторов, устроенный аналогично стеку регистров сопроцессора, для неоднородных объектов – специальный стек системного уровня. Очередное событие из стека очередей обслуживается текущим обработчиком. Размер стека составляет обычно 64 очереди.

И далее:

У нас пока не возникало необходимости программирования многозадачных приложений, хотя техническая возможность создания нескольких процессов в рамках одного приложения имеется, и даже не очень сложна в реализации. Следует лишь помнить, что методы класса функции работают на одном и том же программном стеке, и при переключении процессов следует заботиться о сохранении и восстановлении данных этого стека.
 
Напоминаю, что каждое "ядро" это отдельный физический процессор. В домашних компьютерах как правило имеется всего 1 сокет и все процессоры монтируются на одном куске кремния, так что принято думать будто плата, на которой смонтировано десяток процессоров, это монолитный "процессор", а "ядра" это так, эфемерное понятие. На рабочих станциях и серверах распространены платы с 2, 4 и более сокетами под процессоры, и каждый процессор зачастую состоит из нескольких раздельных чипов, это проливает некоторый свет на идею многоядерности.


Владимир, не вижу связи с предметом разговора. Специально описывается система, которая работает последовательно на одном процессоре, без какой-либо параллельности. А у нас тут наоборот, проблема в том, что люди пытаются натянуть сову на глобус и заставить однопоточный Lua работать сразу на несколько процессоров, с ожидаемым результатом (вылеты скриптов на пустом месте).
 
Артем, Спасибо,я в курсе,что "каждое ядро это отдельный физический процессор". Представьте, что на компьютере один ОДНОЯДЕРНЫЙ процессор. Это ничуть не мешает организовать многопроцессную работу - примерно так, как я описал выше.

Не знаю, каким образом "люди пытаются натянуть сову на глобус и заставить однопоточный Lua работать сразу на несколько процессоров" (с их-то несчастными возможностями тупого интерпретируемого кода), но с "вылетами скриптов на пустом месте" я разобрался - больше не вылетает, исправил все свои ошибки и обвистовал чужие. А вот вылет самого Квика на ровном месте встречается всё чаще: несколько часов назад рухнул и сегодня у одного из брокеров (у которого версия 8.11 - у второго версия 8.8 работает уже несколько месяцев без нареканий). И эта тенденция мне СОВСЕМ не нравится! Кстати, этот брокер порекомендовал мне перейти на новую версию, которая оказалась 8.13, и началось такое, что торги вообще пришлось остановить! Завтра буду разбираться с брокером.
 
QUIK v.8.13.0.106, Lua 5.4

Очередная ошибка
Цитата
attempt to call a nil value (method 'pop')
Скрипт:
Скрытый текст
Queue работает годами в разных скриптах. И (условно) раз в год (или реже) скрипты ругаются на nil. Было в 7-й или 6-й версии квика. Какое тогда было сообщение об ошибке не помню.

Скрытый текст
Я не могу быть заинтересован в устранении ошибок в чужом ПО больше, чем его разработчик.
 
Старатель, добрый день!

Проблема с ошибкой "attempt to call a nil value (method 'pop')" изучается. Постараемся в ближайшее время дать ответ.

Проблему с code highlighter также приняли во внимание.
Касательно нее ответим позднее.
 
Старатель, добрый день!

Проблему с code highlighter починили, можете проверять.
Страницы: 1
Читают тему (гостей: 1)
Наверх