2012-03-30 6 views
4

Twistedを使ってXML-RPCサーバーを構築しています。このサーバーは、ソースファイルのタイムスタンプが変更されたかどうかを定期的に確認し、rebuildを使ってリロードします。Twistedコードのリロードの制限

from twisted.python.rebuild import rebuild 

rebuild(mymodule) 

機能サーバがリロード罰金を取得公開するが、そこmymoduleの同じクラスにコールバック関数を呼び出し、アクティブな別のプロトコルクラスではなく、彼らは機能の再ロードバージョンを使用しないでください。このプロトコルには、値として通常の機能を持つdictがあります。

rebuildの制限に対処することを目的としたこのmixinクラスが見つかりました。

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

どのように私は確かに私のコールバックは、日付コードまで使用するのですか?

答えて

2

正しいですか。これはtwisted.python.rebuildの制限です。既存のインスタンスとインポートされた関数とクラスの属性を更新しています(__class__)。

これに対処する方法の1つは、submit a patch to Twistedにこの場合のrebuildを修正することです。

ただし、Sensitiveをその目的に使用する場合は、コールバック保持クラスを実装して、Twistedの現在のバージョンでrebuildと連携させることもできます。次の例は、関連するクラスの3つのメソッドをすべて使用して、関数を指すコールバックの辞書を更新する方法を示しています。 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()