我正在使用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
如何确保我的回调使用最新代码?
答案 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()