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