Python 延迟库允许打包函数访问多少信息?
我知道如果我延迟一个函数并向它传递一些参数,该函数就有这些参数并且可以使用它们,但是作为实例化对象一部分的函数(例如)可以访问其对象的变量吗Python 延迟库允许打包函数访问多少信息?,python,oop,google-app-engine,deferred-execution,Python,Oop,Google App Engine,Deferred Execution,我知道如果我延迟一个函数并向它传递一些参数,该函数就有这些参数并且可以使用它们,但是作为实例化对象一部分的函数(例如)可以访问其对象的变量吗 class foo (object): def __init__ (self): self.bar = 42 def do_work (self): self.bar += 1 baz = foo() deferred.defer(baz.do_work) 基本上,我必须给函数提供它作为参数所需的所有信息
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的副本将立即被垃圾回收。不过,这不会阻止延迟任务的运行,因为它在反序列化和执行任务时会创建一个新实例。因此,为了确保我完全理解,请重申:deferred.defer(baz.do_work)导致整个baz实例被“保存”(序列化),即使只调用了一个函数。baz可能会被丢弃,但在执行时会从任务的“已保存”数据中“加载”。这真是个奇迹,没错。有关详细信息,请查看Pythonpickle
模块。