【问题标题】:Abandoning coroutines放弃协程
【发布时间】:2026-01-02 04:50:01
【问题描述】:

在 Lua 5.1 中从不让协程正常结束有多糟糕?换句话说,如果一个协程产生但我从未恢复它,它是否会留下很多状态直到程序完成?

cor=coroutine.wrap(somefunc)

while true do
   done=cor()
   if done then -- coroutine exited with "return true" 
       break
   else -- coroutine yielded with "coroutine.yield(false)"
       if some_condition then break end
   end
end

function somefunc()
    -- do something
    coroutine.yield(false)
    -- do some more
    return true
end 

根据上面伪代码中的 some_condition,协程可能永远不会恢复,因此可能永远不会正确“结束”。

我可以对数十个协程执行此操作而不必担心吗?让协程处于这种状态是否安全?这个很贵吗?

【问题讨论】:

  • 我根本不了解 Lua,但如果我站在你的立场上,我想知道一个更大的问题:你如何确定你是否在泄漏内存(或任何你感兴趣的东西当您说“昂贵”时)?例如,如果有工具,那么您可以自己凭经验回答问题。
  • 这可以用于评估内存消耗元素,但我也想知道它是否安全。 IE。会不会造成以后无法预料的问题?

标签: lua coroutine


【解决方案1】:

垃圾收集器可以很容易地确定协程不可达并收集它。我不知道是否有任何文档说明会发生这种情况,但我尝试了“经验方法”:

虽然真的做 local cor = coroutine.wrap(function() coroutine.yield(false) end) 心() 结尾

内存使用量不会随着时间的推移而增长。

编辑:谷歌说:

There is no explicit operation for deleting a Lua coroutine; like any other value in Lua, coroutines are discarded by garbage collection.(PDF 中的第 4 页)

【讨论】: