2

私はtext/event-streamベースのビューを構築してaiohttpおり、Redis の pub-sub をaioredis実装に使用しています。次のようになります。

サーバーからデータを取得してchanellに公開するスクリプト

def main(host, port):
    server_logger.info('Got params connection host {0}, port {1}'.format(host, port))
    loop = asyncio.get_event_loop()
    title = None
    redis = loop.run_until_complete(create_redis(('localhost', 6379)))
    while True:
        new_title = loop.run_until_complete(get_title(host, port))
        if new_title != title:
            loop.run_until_complete(redis.publish('CHANNEL', new_title))
            title = new_title
    loop.close()
    return False

チャネルをサブスクライブして Stream レスポンスに書き込む aiohttp ビュー

stream = web.StreamResponse()
stream.headers['Content-Type'] = 'text/event-stream'
stream.headers['Cache-Control'] = 'no-cache'
stream.headers['Connection'] = 'keep-alive'

await stream.prepare(request)

redis = await create_redis(('localhost', 6379))
channel = (await redis.subscribe('CHANNEL'))[0]

while await channel.wait_message():
        message = await channel.get()
        if message:
            stream.write(b'event: track_update\r\n')
            stream.write(b'data: ' + message + b'\r\n\r\n')
        else:
            continue

そして、私は何度も次のようなものを得ました:

DEBUG:aioredis:Creating tcp connection to ('localhost', 6379)

そのため、ソネクションが失われconcurrent.futures.CancelledError、キープアライブ接続も失われます。接続が頻繁に失われても大丈夫ですか?永続的な接続を期待していましたが、何か不足していたら申し訳ありません。

4

1 に答える 1