2010-09-04 2 views
7

Насколько плохо это в Lua 5.1, чтобы никогда не позволить coroutine правильно закончить? Другими словами, если 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 

В зависимости от some_condition в вышеприведенном псевдокоде, то сопрограммная никогда не может быть возобновлена, и, таким образом, возможно, никогда не правильно «конец».

Могу ли я сделать это с десятками сопрограмм, не беспокоясь? Можно ли оставить сопрограммы в этом состоянии? Это дорого?

+4

Я не знаю, Lua на всех, но если бы я был на вашем месте, я бы хотел знать больше вопрос: как вы можете определить, не утечка памяти (или что вам интересно, когда вы говорите «дорогой»)? Если есть инструмент, например, тогда вы можете ответить на вопрос эмпирически сами. –

+0

Это будет работать для оценки элемента потребления памяти, но мне также интересно, безопасно ли оно. То есть создадут ли это непредвиденные проблемы? – proFromDover

ответ

17

Сборщик мусора может легко определить, что сопрограмма недоступна и собирает ее. Я не знаю, если какой-либо из документации утверждают, что это произойдет, но я попробовал «эмпирический метод»:

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

использование памяти не расти с течением времени.

Edit: Google говорит:

There is no explicit operation for deleting a Lua coroutine; like any other value in Lua, coroutines are discarded by garbage collection. (Page 4 в формате PDF)

+0

PDF отлично, спасибо, что указали его. – proFromDover

 Смежные вопросы

  • Нет связанных вопросов^_^