#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
.
Условия для проверки могут быть довольно сложными; например, вы можете проверить, вызывается ли перехват из определенной функции с определенным количеством команд, выполняемых перед прерыванием.