2010-09-04 65 views
7

在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,協程可能永遠不會恢復,因而可能永遠正確「結束」。

我可以這樣做幾十個協程而不必擔心嗎?在這種狀態下保留協程是否安全?這個很貴嗎?

+4

我不知道Lua中所有,但如果我是你的話,我想知道更大問題:你如何確定你是否在泄漏記憶(或者當你說「昂貴」時感興趣的任何內容)?例如,如果有一個工具,那麼你可以自己回答這個問題。 – 2010-09-04 15:19:27

+0

這將用於評估內存消耗元素,但我也想知道它是否安全。即它會造成後來無法預料的問題嗎? – proFromDover 2010-09-05 03:09:13

回答

17

垃圾收集器可以很容易地確定協程無法訪問並收集它。我不知道是否有任何文檔的狀態,這會發生,但我試過「經驗方法」:

 
while true do 
    local cor = coroutine.wrap(function() coroutine.yield(false) end) 
    cor() 
end 

內存使用量並沒有隨時間增長。

編輯:谷歌表示:

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

+0

PDF很棒,謝謝你指出。 – proFromDover 2010-09-05 03:06:28