Я пытаюсь написать сервер с длинным опросом для Twisted, но боюсь, что не понимаю управление запросами.
Когда клиент уходит со страницы, я вижу, что он продолжает цикл в консоли. Я думал, что экземпляр просто разрушится, когда клиент отключится.
И это моя цель, я хочу запускать логику в DataService индивидуально для каждого подключаемого клиента.
Вот что у меня есть: (я вырубил этот код для простоты использования, возможно, из-за этого были некоторые синтаксические ошибки, но он пришел из рабочего кода)
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)