Отказ от сопрограмм - PullRequest
       7

Отказ от сопрограмм

7 голосов
/ 04 сентября 2010

Насколько плохо в 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 в псевдокоде, приведенном выше, сопрограмма может никогда не возобновиться и, таким образом, никогда не будет корректно завершена.

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

1 Ответ

17 голосов
/ 04 сентября 2010

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

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

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

Редактировать: Google говорит:

Нет явной операции по удалению сопрограммы Lua; Как и любое другое значение в Lua, сопрограммы отбрасываются сборщиком мусора. (Страница 4 в PDF)

...