2010-09-04 11 views
7

Quanto è grave in Lua 5.1 non lasciare mai terminare correttamente una coroutine? In altre parole, se coroutine cede ma non lo riprendo mai, lascia un sacco di stato in giro fino al completamento del programma?Abbandonare le coroutine

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 

seconda some_condition in pseudocodice sopra, la coroutine potrebbe non essere ripreso, e quindi potrebbe non propriamente "fine".

Posso fare questo a dozzine di coroutine senza dovermi preoccupare? È sicuro lasciare le coroutine in questo stato? È costoso?

+4

Non so Lua a tutti, ma se fossi nei tuoi panni, vorrei sapere il più grande domanda: come puoi determinare se stai perdendo memoria (o qualunque cosa ti interessi quando dici "costoso")? Se c'è uno strumento, per esempio, allora puoi rispondere empiricamente alla domanda da solo. –

+0

Questo avrebbe funzionato per valutare l'elemento di consumo della memoria, ma mi stavo chiedendo anche se fosse sicuro. Cioè creerebbe problemi imprevisti in seguito? – proFromDover

risposta

17

Il garbage collector può facilmente determinare che la coroutine è irraggiungibile e raccoglierla. Non so se qualcuno dei documenti affermano che questo accadrà, ma ho provato il "metodo empirico":

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

utilizzo della memoria non è cresciuto nel corso del tempo.

Edit: Google dice:

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

+0

Il PDF è fantastico, grazie per averlo fatto notare. – proFromDover

Problemi correlati