2011-01-31 65 views
3

我知道,如果我推遲一個函數並傳遞一些參數給它,函數就有這些參數並且可以和它們一起工作,但是一個函數可以作爲實例化對象的一部分(例如)訪問其對象的變量?延遲庫允許打包函數訪問多少信息?

class foo (object): 
    def __init__ (self): 
     self.bar = 42 
    def do_work (self): 
     self.bar += 1 

baz = foo() 
deferred.defer(baz.do_work) 

我基本上必須給函數所需的所有信息作爲參數嗎?
另外,如果只有對它的引用是延遲函數,baz是否會被丟棄?

回答

3

如果您在實例方法中傳遞,就像您在代碼示例中一樣,整個實例將被序列化並傳遞。您的foo對象所引用的任何對象也將被序列化,等等。任何全局狀態 - 例如模塊級別和類級別變量 - 都不會被保留,因此它將處於任務狀態,這些變量位於任務執行的實例上。

當您撥打defer時,必要的數據將被序列化併發送到任務隊列,因此如果這是您對baz的唯一引用,那麼baz的副本將立即被垃圾收集。這不會阻止延遲任務運行,因爲它會在反序列化和執行任務時創建新實例。

+0

因此,爲了重申確保我完全理解:deferred.defer(baz.do_work)會導致整個baz實例被「保存」(序列化),即使只調用1個函數。 baz很可能會被丟棄,但是它會在執行任務時從「已保存」的任務數據中「加載」。那裏有一些魔力。 – Milo 2011-02-01 10:49:45