Как заставить несколько клиентов прослушивать событие, отправленное сервером?

Я пытаюсь разобраться в событиях, отправленных сервером. Остальная часть моего сайта обслуживается с помощью 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) обслуживает поток вверх, и страница, использующая его, работает нормально. Однако он работает только с одной системой за раз. Если у меня есть и хром, и хром, читающие поток, только первый получает поток, а другой ничего не получает. Как предоставить обеим системам доступ к потоку одновременно?


person Matt Ellen    schedule 17.07.2012    source источник


Ответы (1)


Очевидно, я не должен использовать 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'}
person Matt Ellen    schedule 17.07.2012