如何使用Twisted服务器共享数据blob,同时在后台定期更新数据?:
from twisted.internet import reactor
from twisted.internet import task
from twisted.web.server import Site
from twisted.web.resource import Resource
data = 1
def update_data():
data += 1
class DataPage(Resource):
isLeaf = True
def render_GET(self, request):
return "<html><body>%s</body></html>" % (data, )
root = Resource()
root.putChild("data", DataPage())
factory = Site(root)
reactor.listenTCP(8880, factory)
m = task.LoopingCall(update_data)
m.start(10.0)
print "running"
reactor.run()
由于以下异常,上述代码无效:
C:\temp>python discovery.py
Unhandled error in Deferred:
Traceback (most recent call last):
File "discovery.py", line 23, in <module>
m.start(10.0)
File "c:\python25\lib\site-packages\twisted\internet\task.py", line 163, in start
self()
File "c:\python25\lib\site-packages\twisted\internet\task.py", line 194, in __call__
d = defer.maybeDeferred(self.f, *self.a, **self.kw)
--- <exception caught here> ---
File "c:\python25\lib\site-packages\twisted\internet\defer.py", line 102, in maybeDeferred
result = f(*args, **kw)
File "discovery.py", line 10, in update_data
data += 1
exceptions.UnboundLocalError: local variable 'data' referenced before assignment
我希望HTTP客户端在此示例中访问http://127.0.0.1:8880/data并检索数据的当前值,同时安排一些其他任务经常更新数据。
此外,我真的不想使用LoopingCall(),因为我可能想根据更新是否成功来改变间隔;更新将是某种远程API调用。我可以用某种方式使用CallLater()吗?
我确定这是一个愚蠢的问题!感谢。
编辑:你帮助正确地使数据变量全局化。对于接下来的人,以下是如何使callLater()
适合代码:
from twisted.internet import reactor
from twisted.internet import task
from twisted.web.server import Site
from twisted.web.resource import Resource
data = 1
def update_data():
global data
data += 1
reactor.callLater(10, update_data)
class DataPage(Resource):
isLeaf = True
def render_GET(self, request):
return "<html><body>%s</body></html>" % (data, )
root = Resource()
root.putChild("data", DataPage())
factory = Site(root)
reactor.listenTCP(8880, factory)
update_data()
print "running"
reactor.run()
此代码仍然感觉有点hacky。我不喜欢声明模块级变量,更不用说使用全局变量了。我欢迎任何避免此类做法的建议,并使代码看起来更清晰,更易于使用。
答案 0 :(得分:2)
为update_data()添加全局def:
def update_data():
global data
data += 1