Twisted Longpoll服务器:断开连接后请求循环持续

2024-05-13 06:47:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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)

Tags: selfdataiftimeresponserequestdefresource
1条回答
网友
1楼 · 发布于 2024-05-13 06:47:04

When the client navigates away from the page, I can see it continue to loop in the console. I thought the instance would just destroy itself when the client disconnects.

首先,实例只有在不再“可访问”时才会被销毁(就像其他类型的对象一样)。在

执行此操作时:

self.loopingCall = task.LoopingCall(self.__print_data)

您正在创建对self.__print_data的引用,该引用包含对self的引用。然后,LoopingCall向reactor注册自己(当您启动它时)。所以现在反应堆有一个间接引用self。所以self将永远存在,或者直到某些事情发生变化。在

您可以通过停止LoopingCall从反应器中注销它自己。一旦reactor不再引用LoopingCall,它将不再保持DataService实例(self)的活动状态。在

如果要在客户端关闭连接时执行此操作,则需要使用Request.notifyFinish。这是covered in the Twisted documentation,但很简单。你应该这样做:

^{pr2}$

这是一个错误,因为您只关心客户端关闭连接的情况,而不是关闭连接的情况。在

相关问题 更多 >