2010-09-04 17 views
7

Jak źle w Lua 5.1 nie pozwala się kończyć prawidłowo? Innymi słowy, jeśli coroutine ustąpi, ale nigdy go nie wznowię, czy pozostawia wiele stanów w pobliżu aż do zakończenia programu?Porzucanie coroutines

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 

zależności some_condition w Pseudokod powyżej, współprogram może nigdy zostać wznowione, a więc nigdy nie może prawidłowo „koniec”.

Czy mogę to zrobić dla kilkudziesięciu partnerów bez obaw? Czy bezpiecznie jest opuszczać coroutines w tym stanie? Czy jest drogie?

+4

nie wiem Lua w ogóle, ale gdybym był na twoim miejscu, chciałbym wiedzieć, tym większy pytanie: w jaki sposób możesz określić, czy masz przeciekać pamięć (lub cokolwiek, co cię interesuje, kiedy mówisz "drogie")? Jeśli istnieje narzędzie, na przykład, możesz samodzielnie odpowiedzieć na pytanie empirycznie. –

+0

Byłoby to pomocne w ocenie elementu zużycia pamięci, ale zastanawiałem się również, czy jest bezpieczny. To znaczy. czy stworzy później nieprzewidziane problemy? – proFromDover

Odpowiedz

17

Śmieciarz może łatwo stwierdzić, że nie ma dostępu do coroutine i go odebrać. Nie wiem, czy któryś z docs stwierdzić, że to się stanie, ale starałem się „metody empirycznej”:

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

Użycie pamięci nie rosną w miarę upływu czasu.

Edit: Google mówi:

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

+0

Plik PDF jest świetny, dzięki za wskazanie go. – proFromDover

Powiązane problemy