- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在 aiohttp
中构建一个基于 text/event-stream
的 View ,并在 aioredis
实现中使用 Redis 的 pub-sub。它看起来像:
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 = 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
并且保持事件连接将丢失。经常断开连接可以吗?我期待有持久的联系,抱歉,如果我遗漏了什么。
最佳答案
起初在请求处理程序中创建新的 redis 连接是个坏主意。请为每个应用程序使用一个连接池。
你可能会得到 https://github.com/KeepSafe/aiohttp/blob/master/demos/polls/aiohttpdemo_polls/main.py作为推荐设计原则的草图。
关于 keep-alived 连接——它们不是很持久,但默认情况下会在 75 秒不活动期后关闭。
您可以通过将 keep_alive=300
参数传递给 app.make_handler()
调用来增加周期,但设置非常大的值并不稳健——在 TCP 期间,自然连接可能在某些情况下会在没有通知的情况下被破坏。如果您没有要传递的数据,最好保持合理的慢超时并定期向服务器发送自定义 ping 请求。
关于python-3.x - 在 aiohttp 应用程序中与 Redis(aioredis) 失去连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39439952/
我正在运行下面的代码。我试图通过创建一个我可以在 aiohttp View 对象中使用的全局连接池对象来将 aioredis 与 aiohttp 一起使用。但是 load_redis 函数出错了。我什
我正在使用 Tornado 和 aioredis。我想测试我的 aioredis.create_redis_pool 实例的一些 aioredis 调用(set、get 等)在 tornado.tes
我通过以下方式创建 redis 池: async def create_redis_connection_pool(app) -> aioredis.Redis: redis = aiored
我用了aioredis用于编写将在特定 channel 上监听并以异步方式运行某些命令的异步服务。 基本上我从examples page中获取了一个代码编写一个小的测试应用程序并删除不必要的部分: i
我尝试在 Tornado 和 Redis 上构建一个具有两个 API 端点的简单系统: API 从 Redis 读取一个值,或者等待这个值存在(使用 BRPOP : value = yield fro
我正在 aiohttp 中构建一个基于 text/event-stream 的 View ,并在 aioredis 实现中使用 Redis 的 pub-sub。它看起来像: 从服务器获取一些数据并发布
我是 Django channel 的新手,正在学习教程 ( https://channels.readthedocs.io/en/latest/tutorial/part_2.html ) 由于 R
我是一名优秀的程序员,十分优秀!