关于lua协程的问题:为什么当另一个线程yield时主线程不继续运行?

为什么当另一个线程yield时主线程不继续运行?

您可以看到终端上没有"hello world"。

function foo()
    print("foo")
    count = 0;
    while(0<1)
    do
       count = count + 1;
       print("count=", count);
       if count>5 then
         break
       end
    end

    return coroutine.yield()
end

co = coroutine.create(function()
        foo();
        print("hello world")  --为什么"hello world"不输出到终端?
        print(type(co))
        return b, "end"
end)

coroutine.resume(co)

补充: 这段代码片段(添加了一行代码)似乎有作用,但我不完全理解为什么。

function foo()
    print("foo")
    count = 0;
    while(0<1)
    do
       count = count + 1;
       print("count=", count);
       if count>5 then
         break
       end
    end

    return coroutine.yield()
end

co = coroutine.create(function()
        foo();
        print("hello world")
        print(type(co))
        return b, "end"
end)

coroutine.resume(co)
coroutine.resume(co)  --添加这一行
点赞
用户2858170
用户2858170

因为协程在被打印之前会先暂停,所以控制台中没有“hello world”。

co = coroutine.create(function ()
        foo();  -- <-- 协程.yield() 在这里!
        print("hello world")
        print(type(co))
        return b, "end"
  end)

在打印“hello world”之前,您的协程调用了foo()。在foo内部,您调用了coroutine.yield。因此,您的单个coroutine.resume已经返回,程序已经完成。将第二个coroutine.resume(co)添加到代码中将使co在yield后继续执行,因此从“print("hello world")”重新开始。

2021-01-08 07:40:45