2012-03-30 6 views
4

Я строю сервер XML-RPC с помощью Twisted, который периодически проверяет, изменили ли временные метки исходных файлов и перезагрузили их, используя rebuild.Ограничения перезагрузки витого кода

from twisted.python.rebuild import rebuild 

rebuild(mymodule) 

Функция сервер выставляет перезагружаются штраф, но в другом классе протокола активного который вызывает функцию обратного вызова на тот же класс mymodule, но они не используют перезагруженную версию функций. Этот протокол просто имеет dict с нормальными функциями как значения.

Я нашел этот класс mixin, который предназначен для устранения ограничений rebuild.

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

Как я убедиться, что мои функции обратного вызова использовать код даты?

ответ

2

Вы правы; это ограничение twisted.python.rebuild. Он обновляет атрибут __class__ существующих экземпляров и импортирует функции и классы.

Один из способов борьбы с этим - просто submit a patch to Twisted, который исправляет rebuild для этого случая.

Однако, если вы хотите использовать Sensitive по прямому назначению, вы также можете реализовать свой класс обратного вызова для работы с rebuild в текущих версиях Twisted. В следующих примерах показано, как использовать все три метода соответствующего класса для обновления словаря обратных вызовов, указывающих на функции. Обратите внимание, что даже без теста 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() 
Смежные вопросы