我知道如果我推迟一个函数并向它传递一些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会被删除吗?
答案 0 :(得分:3)
如果传入实例方法,就像在代码示例中一样,整个实例将被序列化并传递。您的foo
对象引用的任何对象也将被序列化,依此类推。任何全局状态(例如,模块级别和类级别变量)都不会被保留,因此它将处于任务执行的实例上的变量的任何状态。
必要的数据被序列化并在您调用defer
时被发送到任务队列,因此如果这是您对baz的唯一引用,那么baz的副本将立即被垃圾收集。但是,这不会阻止延迟任务的运行,因为它会在反序列化并执行任务时创建一个新实例。