2010-09-04 7 views
7

¿Qué tan malo es en Lua 5.1 para nunca dejar que una coroutine termine correctamente? En otras palabras, si una corutina cede, pero nunca la reanudo, ¿deja un montón de estado hasta la finalización del programa?Abandonar corutinas

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 

Dependiendo de some_condition en el pseudocódigo anterior, la co-rutina nunca podría reanudarse, y por lo tanto nunca podría adecuadamente "fin".

¿Podría hacer esto en docenas de coroutines sin tener que preocuparme? ¿Es seguro dejar corroutines en este estado? ¿Es caro?

+4

No sé Lua en absoluto, pero si yo estuviera en tu lugar, yo quiero saber cuanto más grande pregunta: ¿cómo puede determinar si está perdiendo memoria (o lo que le interesa cuando dice "caro")? Si hay una herramienta, por ejemplo, entonces usted mismo puede responder la pregunta empíricamente. –

+0

Eso funcionaría para evaluar el elemento de consumo de memoria, pero también me preguntaba si era seguro. Es decir. ¿Creará problemas posteriores imprevistos? – proFromDover

Respuesta

17

El recolector de basura puede determinar fácilmente que la coroneta es inalcanzable y recogerla. No sé si alguno de los documentos afirman que esto va a suceder, pero probé el "método empírico":

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

uso de memoria no creció con el tiempo.

Editar: Google dice:

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

+0

El PDF es excelente, gracias por señalarlo. – proFromDover

Cuestiones relacionadas