2010-09-04 37 views
7

Làm thế nào xấu là nó trong Lua 5.1 để không bao giờ để cho một coroutine đúng kết thúc? Nói cách khác, nếu sản lượng coroutine nhưng tôi không bao giờ tiếp tục nó, nó có để lại rất nhiều trạng thái nằm xung quanh cho đến khi chương trình hoàn thành?Hủy bỏ 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 

Tùy thuộc vào some_condition trong giả trên, coroutine có thể không bao giờ được nối lại, và do đó có thể không bao giờ đúng "kết thúc".

Tôi có thể thực hiện việc này với hàng tá coroutines mà không phải lo lắng không? Có an toàn không để lại các coroutines trong trạng thái này? Nó có đắt không?

+4

Tôi không biết Lua ở tất cả, nhưng nếu tôi đang ở trong đôi giày của bạn, tôi sẽ muốn biết càng lớn câu hỏi: làm thế nào bạn có thể xác định xem bạn đang rò rỉ bộ nhớ (hoặc bất cứ điều gì bạn quan tâm khi bạn nói "đắt tiền")? Ví dụ, nếu có một công cụ, bạn có thể tự mình trả lời câu hỏi. –

+0

Điều đó sẽ làm việc để đánh giá yếu tố tiêu thụ bộ nhớ, nhưng tôi cũng tự hỏi liệu nó có an toàn hay không. I E. liệu nó có tạo ra các vấn đề không lường trước được không? – proFromDover

Trả lời

17

Bộ thu gom rác có thể dễ dàng xác định rằng coroutine không thể truy cập và thu thập nó. Tôi không biết liệu có bất kỳ tài liệu nào nói rằng điều này sẽ xảy ra, nhưng tôi đã thử phương pháp "thực nghiệm":

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

Sử dụng bộ nhớ không tăng theo thời gian.

Edit: Google cho biết:

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

+0

PDF là tuyệt vời, cảm ơn bạn đã chỉ ra. – proFromDover