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 は破棄されますか?

4

1 に答える 1

3

コード サンプルのように、インスタンス メソッドを渡すと、インスタンス全体がシリアル化されて渡されます。オブジェクトが参照するすべてのオブジェクトfooもシリアル化されます。モジュール レベル変数やクラス レベル変数などのグローバルな状態は保持されないため、タスクが実行されるインスタンス上でこれらの変数がどのような状態であってもそのままになります。

必要なデータはシリアル化され、 を呼び出した時点でタスク キューに送信されますdefer。そのため、それが baz への唯一の参照である場合、その baz のコピーはすぐにガベージ コレクションされます。ただし、タスクを逆シリアル化して実行するときに新しいインスタンスが作成されるため、遅延タスクの実行が停止することはありません。

于 2011-02-01T02:51:57.493 に答える