Почему умерает корутина?

Страницы: 1
RSS
Почему умерает корутина?
 
Есть функция, вызывается как корутина.
В ней две остановки - после выставления ордера и после снятия ордера.
в трансрепли (или в ордеррепли - не важно) стоит разрешение работать дальше.
Первая остановка проходит нормально, заявка выставляется.
Пока корутина не начала работать её статус - suspended
начала - running
когда выполняем первый останов статус - suspended
транзрепли его отлепляет и статус становится опять running
тут все понятно, все логично так и быть должно

но, когда в функции начинает исполнятся другая функция (это единственное наблюдение) статус моей корутины - dead.
А я еще не дошел до второй остановки даже. Не с чего ей останавливаться по завершению. Я ведь правильно понимаю, что dead - значит завершена? или я не прав?
 
Здравствуйте,
К сожалению, затруднюсь назвать причины.
Возможно что то делаете не так.
В соседней ветке, Вам рекомендовали для ознакомления статьи по теме корутинов.
 
не особо разбирал ваш пример в соседней ветке - бо как там всё надо переделывать, но что бросается в глаза: у вас в майне создаётс thread-объект "co". Причём каждый цикл майна создаёт/затирает предыдущий объект корутины. Причё, это всё абсолютно никак у вас не синхронизировано с resume из коллбеков. То есть получается, что код становится абсолютно неуправляемым и LUA непонимает какой именно объект запускать или приостанавливать в каждый момент времени. бо как указано выше, у вас одна и таже переменная создаётся/используется в цикле.
 
sam063rus, да, я его переделал. Вынес создание за цикл, резюмировал в итоге только тогда когда статус - dead.
Вот сейчас это выглядит так: (то, что относится к корутине)

Код
function OnOrder(trans_order)
PrintDbgStr("В онордере прошло событие flag ="..tostring(flag))
PrintDbgStr("статус в онордере " .. tostring(coroutine.status(co)))
--if coroutine.status(co) == "running" then coroutine.resume(co) end
   if flag and trans_order["sec_code"] == SECCODE and trans_order["brokerref"] == COMMENT_ALL and trans_order["class_code"] == CLASSCODE then 
      table.sinsert(ORDER_TABLE,1,trans_order) 
      PrintDbgStr("Прошли по условию в онордер")
      flag = false
      --if coroutine.status(co) == "normal" or coroutine.status(co) == "suspended" then coroutine.resume(co) end
      coroutine.resume(co)
   end
end
 
закомментированы разные варианты, я пробую то так то эдак.. Flag, что бы при двойном подтверждении два раза не срабатывал резюм.


Код
function bots()
   PrintDbgStr("В BOTS скрипте даем команду на продажу")
   PrintDbgStr(tostring(coroutine.status(co)))
   --_SellOpt(TRID_TRADE,2000,QTY,MODE,COMMENT_ALL)
   flag = true
   _SellOpt(TRID_TRADE,2000,QTY,MODE,COMMENT_ALL)
   PrintDbgStr("BOTS залип после продажи")
   coroutine.yield()
   PrintDbgStr("BOTS отлип после продажи")
   --sleep (5000)
   PrintDbgStr("приступаем к удалению")
   PrintDbgStr(tostring(coroutine.status(co)))
   --sleep(1000)
   
   num2 = _GetActiveOrdersNum()[1]
   PrintDbgStr("Выставлена заявка №".. tostring(num2))
   flag = true
   _KillOrder(num2,TRID_KILL)
   PrintDbgStr("BOTS залип после удаления")
   coroutine.yield()
   PrintDbgStr("BOTS отлип после удаления")
   --coroutine.resume(co)
end

is_run=true
flag = true


PrintDbgStr(COMMENT_ALL..": Инициализация прошла")
co = coroutine.create(bots)

function main( ... )
first = true


PrintDbgStr(tostring(coroutine.status(co)))
   while is_run do   
      PrintDbgStr("В основном скрипте пошел прогон")
      PrintDbgStr(tostring(coroutine.status(co)))
      if first then coroutine.resume(co)
         first = false
         end

      if coroutine.status(co) == "dead" then 
         co = coroutine.create(bots)
      end
      
      PrintDbgStr(tostring(coroutine.status(co)))

      sleep(200)
   end

end
 
и лог в итоге:
Скрытый текст
вот это место:

00000017    0.37016127    [9384] BOTS отлип после продажи    
00000018    0.37022066    [9384] приступаем к удалению    
00000019    0.37028122    [9384] running    
00000020    0.37132820    [9384] В онордере прошло событие flag =false    
00000021    0.37138492    [9384] статус в онордере dead    

с чего вдруг когда отлипает BOTS, скрипт проходит дальше,статус руннинг, и как заходит в num2 = _GetActiveOrdersNum()[1], появляется событие в онордере, flag пустить не должен на резюм, а статус уже DEAD. Что может два раза резюмировать или даже три!!! чтобы корутина померла так досрочно..
 
Viktor MMM
Попробуйте рассмотреть работу Вашей программы,
когда приходят onorder, а корутина еще занята обработкой предыдущего.
-----------------------------------------
Для использования корутины с колбеками надо делать очередь.
 
Да, Николай, здравствуйте.
Я понял уже что появление события рубит мой поток или как его назвать.. Хотел сделать скрипт изящнее, с использованием возможностей клуа, но, из-за того что я не программист, пришлось приводить архитектуру к обычному синхронному языку. События дополняют таблицы и все. А скрипт по этим таблицам в нужное время работает. Понимаю, что получился велосипед на платформе машины, но только так смог добиться устойчивой работы.
Страницы: 1
Читают тему
Наверх