📜  中断 lua (1)

📅  最后修改于: 2023-12-03 14:48:54.274000             🧑  作者: Mango

中断 Lua

简介

中断是一种在程序执行过程中,暂时停止当前的任务,去处理一个优先级更高的任务,然后在后续继续原来的任务。在 Lua 中,我们可以使用协程来实现类似中断的机制。

协程

协程是一种用户级的线程,可以在运行到某个状态时暂停,然后继续从该状态恢复执行。在 Lua 中,我们可以通过 coroutine.create 创建一个协程,通过 coroutine.resume 来恢复协程的执行,通过 coroutine.yield 来暂停协程的执行。

local co = coroutine.create(function()
    print("Hello")
    coroutine.yield()
    print("World")
end)

coroutine.resume(co) -- 输出 "Hello"
coroutine.resume(co) -- 输出 "World"
中断协程

我们可以通过使用 coroutine.yield 来实现中断协程的效果。当我们执行 coroutine.yield 时,协程会暂停执行并返回一个或多个值给调用者,然后等待被恢复。在下一次调用 coroutine.resume 时,协程会从暂停的地方继续执行。

local function task1()
    print("Task 1 started")
    for i = 1, 3 do
        print("Task 1", i)
        coroutine.yield()
    end
    print("Task 1 finished")
end

local function task2()
    print("Task 2 started")
    for i = 1, 5 do
        print("Task 2", i)
        coroutine.yield()
    end
    print("Task 2 finished")
end

local co1 = coroutine.create(task1)
local co2 = coroutine.create(task2)

while true do
    if coroutine.status(co1) ~= "dead" then
        coroutine.resume(co1)
    end
    if coroutine.status(co2) ~= "dead" then
        coroutine.resume(co2)
    end
    if coroutine.status(co1) == "dead" and coroutine.status(co2) == "dead" then
        break
    end
end

以上代码创建了两个协程 co1co2,分别执行了 task1task2 函数。通过不断地调用 coroutine.resume 来交替执行这两个协程,实现了中断的效果。在每个任务中使用 coroutine.yield 来暂停协程的执行,等待下次执行。

总结

通过使用协程,我们可以在 Lua 中实现类似中断的机制,暂停当前任务,处理其他优先级更高的任务,然后再继续执行原来的任务。在实际开发中,协程在处理一些耗时操作或需要等待外部事件响应时非常有用。