我试图用Twisted编写一个longpolling服务器,但恐怕我不理解请求管理。在
当客户机离开页面时,我可以看到它在控制台中继续循环。我认为当客户端断开连接时,实例会自行销毁。在
这就是我的目标,我想为每个连接的客户机单独运行数据服务中的逻辑。在
以下是我所拥有的:(为了便于使用,我将代码切掉了,可能是因为这个原因出现了一些语法错误,但它来自工作代码)
class DataService(Resource):
def __init__(self, sid):
# set looping call
self.loopingCall = task.LoopingCall(self.__print_data)
self.loopingCall.start(5, False)
Resource.__init__(self)
self.sid = int(sid);
self.finished = False
# initialize response
self.response = response = {'status':1, 'message': 'OK', 'time':int(time.time()), 'data': {}}
def connectionLost(self, reason):
self.loopingCall.stop();
def render_GET(self, request):
# response will be json format
request.setHeader('Content-Type', 'application/json')
# make sure required GET vars exist
if 'lastupdate' not in request.args:
self.loopingCall.stop()
return ujson.dumps({'status':0,'message':'invalid query','data':{}})
# set last update timestamp from query string
self.lastupdate = int(request.args['lastupdate'][0])
# set self.request so we can access it in __print_data
self.request = request
# call print data
self.__print_data()
if not self.finished:
return server.NOT_DONE_YET
def __print_data(self):
# set updated data
if self.lastupdate < self.myappobj.lastupdate
self.response{'data']['items'] = {'foo':'bar'}
# if updates were found, close loop, print, and finish request
if len(response['data']) > 0:
self.loopingCall.stop()
self.request.write(self.jsonpcallback+'('+ujson.dumps(response)+')')
self.request.finish()
self.finished = True
class DataServer(Resource):
def getChild(self, sid, request):
return DataService(sid)
首先,实例只有在不再“可访问”时才会被销毁(就像其他类型的对象一样)。在
执行此操作时:
您正在创建对
self.__print_data
的引用,该引用包含对self
的引用。然后,LoopingCall
向reactor注册自己(当您启动它时)。所以现在反应堆有一个间接引用self
。所以self
将永远存在,或者直到某些事情发生变化。在您可以通过停止
LoopingCall
从反应器中注销它自己。一旦reactor不再引用LoopingCall
,它将不再保持DataService
实例(self
)的活动状态。在如果要在客户端关闭连接时执行此操作,则需要使用
^{pr2}$Request.notifyFinish
。这是covered in the Twisted documentation,但很简单。你应该这样做:这是一个错误,因为您只关心客户端关闭连接的情况,而不是关闭连接的情况。在
相关问题 更多 >
编程相关推荐