延迟库允许打包函数访问多少信息?

时间:2011-01-31 20:41:25

标签: python oop google-app-engine deferred-execution

我知道如果我推迟一个函数并向它传递一些args,那么该函数有那些args并且可以使用它们,但是一个实例化对象(例如)的函数是否可以访问其对象的变量?

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

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

我基本上必须给函数提供它作为参数需要的所有信息吗? 如果对它的唯一引用是在延期函数中,那么baz会被删除吗?

1 个答案:

答案 0 :(得分:3)

如果传入实例方法,就像在代码示例中一样,整个实例将被序列化并传递。您的foo对象引用的任何对象也将被序列化,依此类推。任何全局状态(例如,模块级别和类级别变量)都不会被保留,因此它将处于任务执行的实例上的变量的任何状态。

必要的数据被序列化并在您调用defer时被发送到任务队列,因此如果这是您对baz的唯一引用,那么baz的副本将立即被垃圾收集。但是,这不会阻止延迟任务的运行,因为它会在反序列化并执行任务时创建一个新实例。