2011-01-31 28 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

相关问题