1

サーバーが送信したイベントに頭を悩ませようとしています。私のサイトの残りの部分は、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) と chromium (ubuntu 12.04) でテストすると、ストリームアップが提供され、それを使用するページは正常に動作します。ただし、一度に 1 つのシステムしか機能しません。クロムとクロムの両方がストリームを読み取っている場合、最初のものだけがストリームを取得し、もう一方は何も取得しません。両方のシステムに同時にストリームへのアクセスを許可するにはどうすればよいですか?

4

1 に答える 1

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'}
于 2012-07-17T09:30:15.053 に答える