2012-03-30 16 views
4

Ich baue einen XML-RPC-Server mit Twisted, die regelmäßig überprüft, ob die Zeitstempel ihrer Quelldateien geändert haben und lädt sie erneut mit rebuild.Einschränkungen beim erneuten Laden von Twisted-Code

from twisted.python.rebuild import rebuild 

rebuild(mymodule) 

Die Funktionen der Server neu geladen fein macht, aber in einem anderen Protokoll Klasse dort aktiv, die auf der gleichen Klasse von mymodule Callback-Funktionen aufruft, aber sie haben nicht die neu geladen Version der Funktionen nutzen. Dieses Protokoll hat einfach eine dict mit normalen Funktionen als Werte.

Ich fand diese Mixin-Klasse, die mit Einschränkungen von rebuild umgehen soll.

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

Wie kann ich Rückrufe bisher Code aufbrauchen stellen Sie sicher?

Antwort

2

Sie haben Recht; Dies ist eine Einschränkung von twisted.python.rebuild. Es aktualisiert das Attribut __class__ vorhandener Instanzen und importiert Funktionen und Klassen.

Eine Möglichkeit, damit umzugehen, wäre einfach submit a patch to Twisted, die rebuild für diesen Fall behebt.

Wenn Sie jedoch Sensitive für den vorgesehenen Zweck verwenden möchten, können Sie auch Ihre Callback-Halteklasse implementieren, um mit rebuild auf aktuellen Versionen von Twisted zu arbeiten. Die folgenden Beispiele zeigen, wie alle drei Methoden der relevanten Klasse verwendet werden, um ein Wörterbuch mit Rückrufen zu aktualisieren, die auf Funktionen verweisen. Beachten Sie, dass auch ohne den if needRebuildUpdate...-Test der Aufruf von x() direkt immer die aktuellste Version erhält.

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() 
Verwandte Themen