Lua 协程有什么用处?为什么这段代码不能如我所愿般工作?

我在理解这段代码时遇到了困难...我原本期望得到类似于线程的输出,其中随机的“nooo”和“yaaaay”间隔打印,但是我发现主线程似乎会在第一次调用coroutine.resume()时被阻塞,因此防止第二个coroutine的启动直到第一个已经yield。

如果这是coroutines的预期操作,它们有什么用途,我如何实现我想要的目标呢?我是否需要为这些coroutines实现自己的调度器以使其异步操作? 因为这看起来很麻烦,所以我可能还不如使用函数!

co1 = coroutine.create(function ()
        local i = 1
        while i < 200 do
                print("nooo")
                i = i + 1
        end
        coroutine.yield()
end)

co2 = coroutine.create(function ()
        local i = 1
        while i < 200 do
                print("yaaaay")
                i = i + 1
        end
        coroutine.yield()
end)

coroutine.resume(co1)
coroutine.resume(co2)

原文链接 https://stackoverflow.com/questions/5128375

点赞
stackoverflow用户28817
stackoverflow用户28817

协程不是线程。

协程就像从未主动调度的线程。所以你是有点正确的,你需要编写你自己的调度器来让两个协程同时运行。

然而当涉及到协程时,你忽略了更大的局面。查看维基百科的协程常见用途。以下是一个具体的例子,可能会给你指导方向。

    ——关卡脚本
    ——每2分钟火山喷发
    function level_with_volcano(interface)

        while true do
            wait(seconds(5))
            start_eruption_volcano()
            wait(frames(10))
            s = play("rumble_sound")
            wait(end_of(s))
            start_camera_shake()

            --更多内容

            wait(minutes(2))
        end

    end

上面的脚本可以通过switch语句和一些巧妙的状态变量编写来循环运行,但它用作协程时更加明显。上述脚本可以是一个线程,但是你真的需要为这个简单的代码专门分配一个内核线程吗?繁忙的游戏关卡可能有数百个这样的协程同时运行,而不会影响性能。然而,如果每个协程都是一个线程,你可能只能用20-30个左右,否则性能就会受到影响。

协程的目的是允许我编写在栈上存储状态的代码,以便我可以在一段时间内停止运行它(wait函数),然后从我离开的地方重新启动它。

2011-02-26 17:25:14
stackoverflow用户1274599
stackoverflow用户1274599
co1 = coroutine.create(
    function()
        for i = 1, 100 do
            print("co1_"..i)
            coroutine.yield(co2)
        end
    end
)

co2 = coroutine.create(
    function()
        for i = 1, 100 do
            print("co2_"..i)
            coroutine.yield(co1)
        end
    end
)

for i = 1, 100 do
    coroutine.resume(co1)
    coroutine.resume(co2)
end
co1 = coroutine.create(
    function()
        for i = 1, 100 do
            print("co1_"..i)
            coroutine.yield(co2)
        end
    end
)

co2 = coroutine.create(
    function()
        for i = 1, 100 do
            print("co2_"..i)
            coroutine.yield(co1)
        end
    end
)

for i = 1, 100 do
    coroutine.resume(co1)
    coroutine.resume(co2)
end
2012-03-16 17:24:29