如何让多个客户端监听服务器发送的事件?

时间:2012-07-17 09:09:18

标签: python cherrypy server-sent-events

我试图了解服务器发送的事件。我的网站的其余部分使用cherrypy服务,所以我也想让他们在这个平台上工作。

我用来公开SSE的方法:

@cherrypy.expose
def interlocked(self, _=None):
    cherrypy.response.headers["Content-Type"] = "text/event-stream;charset=utf-8"
    if _:
        data = 'retry: 400\n'
        while not self.interlockUpdateQueue.empty():
            update = self.interlockUpdateQueue.get(False)
            data += 'data: ' + str(update) + '\n\n'
        return data
    else:
        def content():
            while not self.interlockUpdateQueue.empty():
                update = self.interlockUpdateQueue.get(True, 400)
                data = 'retry: 400\ndata: ' + str(update) + '\n\n'
                yield data
        return content()
interlocked._cp_config = {'response.stream': True, 'tools.encode.encoding':'utf-8'}

对chrome(win 7)和chrome(ubuntu 12.04)进行测试,这可以提升流量,使用它的页面工作正常。但是它一次只能运行一个系统。如果我同时读取流中的chrome和chromium,则只有第一个获取流,另一个获取任何内容。如何让两个系统同时访问流?

1 个答案:

答案 0 :(得分:2)

显然我不应该使用Queue。所以我只需要将代码缩减为:

@cherrypy.expose
def interlocked(self, _=None):
    cherrypy.response.headers["Content-Type"] = "text/event-stream;charset=utf-8"
    if _:
        data = 'retry: 400\ndata: ' + str(self.isInterlocked) + '\n\n'
        return data
    else:
        def content():
            data = 'retry: 400\ndata: ' + str(self.isInterlocked) + '\n\n'
            return data
        return content()
interlocked._cp_config = {'response.stream': True, 'tools.encode.encoding':'utf-8'}