Twisted代码重新加载的局限性

时间:2012-03-30 03:01:28

标签: python twisted

我正在使用Twisted构建XML-RPC服务器,该服务器会定期检查其源文件的时间戳是否已更改,并使用rebuild重新加载它们。

from twisted.python.rebuild import rebuild

rebuild(mymodule)

服务器公开的函数可以很好地重新加载,但是在另一个激活的协议类中,它调用同一类mymodule上的回调函数,但它们不使用重新加载的函数版本。该协议只有dict具有正常的函数作为值。

我发现这个mixin类旨在处理rebuild的限制。

http://twistedmatrix.com/documents/current/api/twisted.python.rebuild.Sensitive.html

如何确保我的回调使用最新代码?

1 个答案:

答案 0 :(得分:2)

你是对的;这是twisted.python.rebuild的限制。它是在更新现有实例的__class__属性,以及导入的函数和类。

处理此问题的一种方法是简单submit a patch to Twisted修复rebuild此案例。

但是,如果您想将Sensitive用于其预期目的,您还可以实现回调保持类,以便在当前版本的Twisted上使用rebuild。以下示例演示如何使用相关类的所有三个方法来更新指向函数的回调字典。请注意,即使没有if needRebuildUpdate...测试,直接调用x()也会始终获得最新版本。

from twisted.python.rebuild import rebuild, Sensitive
from twisted.python.filepath import FilePath

p = FilePath("mymodule.py")
def clearcache():
    bytecode = p.sibling("mymodule.pyc")
    if bytecode.exists():
        bytecode.remove()
clearcache()
p.setContent("def x(): return 1")
import mymodule
from mymodule import x
p.setContent("def x(): return 2")

class Something(Sensitive, object):
    def __init__(self):
        self.stuff = {"something": x}
    def invoke(self):
        if self.needRebuildUpdate():
            for key in list(self.stuff):
                self.stuff[key] = self.latestVersionOf(self.stuff[key])
            self.rebuildUpToDate()
        return self.stuff["something"]()

def test():
    print s.invoke()
    print x()

s = Something()
test()

clearcache()
rebuild(mymodule)

test()