как я могу остановить выполнение функционального блока / вызова lua в середине

#lua

#lua

Вопрос:

есть ли способ остановить lua pcall для функционального блока lua в середине выполнения? Я использую несколько потоков, и было бы неплохо отменить функцию в середине выполнения.

Комментарии:

1. Сам Lua не поддерживает многопоточность. Объясните, как вы используете многопоточность.

Ответ №1:

Самый простой способ — вызвать error('my message') , поскольку это прервет выполнение и вернет nil, 'my message' результат pcall() . Если вы хотите прервать выполнение сопрограммы (или «основного» блока) «извне», единственный известный мне способ сделать это без изменения Lua VM — это присоединить отладочный хук к сопрограмме или основному блоку и вызвать error() из этого отладочного хука:

 print(1)
local count = 0
debug.sethook(function(event, line)
  if count > 1 then error('done', 2) end
  count = count   1
end, "l")
print(2)
print(3)
print("not getting here")
 

Вы должны увидеть что-то вроде этого:

 1
2
3
script.lua:4: done
 

В случае pcall , вы увидите параметр error() вызова, который будет передан в качестве сообщения об ошибке pcall .

Условия для проверки могут быть довольно сложными; например, вы можете проверить, вызывается ли перехват из определенной функции с определенным количеством команд, выполняемых перед прерыванием.